码迷,mamicode.com
首页 > 编程语言 > 详细

多线程编程

时间:2017-06-12 14:46:38      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:tran   失败   ati   tin   创建   include   out   options   释放   

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992340.html

 最近想将ucos移植到VC2010上运行,这就碰到了现在的第一个问题:VC上怎么进行线程间的切换。毕业之后基本没有碰过pc机上的编程,这也导致对VC的多线程编程的API一点多不熟悉。花了很长时间在baidu上搜索资料,终于有了一些收获,不是不想在google上搜索资料,但是最近不知道为什么google老是上不去。现在将这些搜索到的资料进行总结。

  多线程的API:

(1) HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
                     DWORD dwStackSize,
                     LPTHREAD_START_ROUTINE lpStartAddress,
                     LPVOID lpParameter,
                     DWORD dwCreationFlags,
                     LPDWORD lpThreadId);
  该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。
(2)DWORD SuspendThread(HANDLE hThread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
(3)DWORD ResumeThread(HANDLE hThread);
该函数用于结束线程的挂起状态,执行线程。
(4)VOID ExitThread(DWORD dwExitCode);
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
(5)BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);   一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。   使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 (6)BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);   该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。   调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。

(7)BOOL DuplicateHandle(HANDLE hSourceProcessHandle,
               HANDLE hSourceHandle,      
               HANDLE hTargetProcessHandle,
               LPHANDLE lpTargetHandle,    
               DWORD dwDesiredAccess,    
               BOOL bInheritHandle,
               DWORD dwOptions);
这个API看说明以及一些解释之后,还是有些迷迷糊糊的,可能脑子不太灵光。后来通过程序终于导致搞清楚些,这就不多说了,还是看例子吧,以免误导。


#include <windows.h>
#include <stdio.h>
const UINT uiTimerID = 10;

HANDLE mainhandle;

int msg_count = 0;
HANDLE hd_send_thread;
HANDLE hd_recv_thread;

void send_thread_func()
{
    while(1)
    {
        msg_count++;
        printf("msg_count: %d\n", msg_count);
        Sleep(1000);
        if(msg_count > 5)
        {
            DuplicateHandle(GetCurrentProcess(),
                            hd_recv_thread,
                            GetCurrentProcess(),
                            &mainhandle,
                            0,
                            TRUE,
                            2);
            ResumeThread(mainhandle);
            SuspendThread(GetCurrentThread());
        }
    }
}

void recv_thread_func()
{
    static int recv_msg_count = 0;
    while(1)
    {
        if(recv_msg_count < msg_count)
        {
            printf("recv_msg_count: %d\n", recv_msg_count++);
            Sleep(1000);
        }
        else
        {
            exit(0);
        }
    }
}

VOID CALLBACK TimerFun(HWND hwnd, UINT a, UINT b, DWORD c)
{
    static int nCount = 0;
    printf("Timer Function, nCount = %d..........................\n", nCount++);

    if(nCount > 5)
    {
        DuplicateHandle(GetCurrentProcess(),
                        hd_send_thread,
                        GetCurrentProcess(),
                        &mainhandle,
                        0,
                        TRUE,
                        2);
        ResumeThread(mainhandle);
        SuspendThread(GetCurrentThread());    
    }
}

int main()
{
    MSG msg;

    SetTimer(NULL, uiTimerID, 1000, TimerFun);

    hd_send_thread = CreateThread(NULL,
                                  0,
                                  (LPTHREAD_START_ROUTINE)send_thread_func,
                                  0,
                                  0,
                                  0);
    SuspendThread(hd_send_thread);

    hd_recv_thread = CreateThread(NULL,
                                  0,
                                  (LPTHREAD_START_ROUTINE)recv_thread_func,
                                  0,
                                  0,
                                  0);
    SuspendThread(hd_recv_thread);
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return   0;
}

程序的流程为:创建一个1s中的定时器,一个hd_send_thread线程,一个hd_recv_thread线程,
       其中hd_send_thread和hd_recv_thread线程创建之后就将其挂起。
       定时器中断5次之后,将hd_send_thread线程唤醒,将其自己挂起,
       hd_send_thread运行到msg_count>5时,将其自己挂起,唤醒hd_recv_thread线程,
hd_recv_thread运行到recv_msg_count>5时,退出程序。

 

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992340.html

多线程编程

标签:tran   失败   ati   tin   创建   include   out   options   释放   

原文地址:http://www.cnblogs.com/flyingcloude/p/6992340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!