首页 > 用户发贴区 > 编程问题提问区 > 怎么样知道一个线程的状态
2006
09-14

怎么样知道一个线程的状态

我在程序里开了一个线程序,但是我怎么样才能知道这个线程的状态,是在运行中,挂起,还是已经结束.是用WaitForSingleObject吗?但是我不知道这个函数怎么用.


怎么样知道一个线程的状态》有 3 条评论

  1. VC爱好者 说:

    WaitForSingleObject的用法                                      

    WaitForSingleObject的用法

    DWORD WaitForSingleObject(
      HANDLE hHandle,
      DWORD dwMilliseconds
    );
    参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

    hHandle可以是下列对象的句柄:

        Change notification
    Console input
    Event
    Job
    Memory resource notification
    Mutex
    Process
    Semaphore
    Thread
    Waitable timer

    WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。在这里举个例子:

    先创建一个全局Event对象g_event:

        CEvent g_event;

    在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。

    下面是一个线程函数MyThreadPro()

    UINT CFlushDlg::MyThreadProc( LPVOID pParam )
    {

       WaitForSingleObject(g_event,INFINITE);
       For(;;)

            {

       …………

            }
         return 0;
    }

    在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。

    还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体

         UINT CFlushDlg::MyThreadProc( LPVOID pParam )

    {

       while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_ 0)

         {

             ………………

         }

         return 0;

    }

    在这个线程函数中可以可以通过设置MT_INTERVAL来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了。

  2. VC爱好者 说:

    或者先用createprocess创建进程,将返回的句柄用于waitforsingleobject,wait返回时进程即运行完毕

  3. VC爱好者 说:

    提供一个多线程的代码参考

    在vc下编译通过!

    #include <windows.h>
    #include <iostream.h>

    DWORD WINAPI Fun1Proc(
    LPVOID lpParameter // thread data
    );

    DWORD WINAPI Fun2Proc(
    LPVOID lpParameter // thread data
    );
    int index=0;
    int tickets=100;
    HANDLE hMutex;
    void main()
    {
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    /*while(index++<1000)
    cout<<”main thread is running”<<endl;*/
    //hMutex=CreateMutex(NULL,TRUE,NULL);
    hMutex=CreateMutex(NULL,TRUE,”tickets”);
    if(hMutex)
    {
    if(ERROR_ALREADY_EXISTS==GetLastError())
    {
    cout<<”only instance can run!”<<endl;
    return;
    }
    }
    WaitForSingleObject(hMutex,INFINITE);
    ReleaseMutex(hMutex);
    ReleaseMutex(hMutex);
    Sleep(4000);
    // Sleep(10);
    }

    DWORD WINAPI Fun1Proc(
    LPVOID lpParameter // thread data
    )
    {
    /*while(index++<1000)
    cout<<”thread1 is running”<<endl;*/

    /*while(TRUE)
    {
    //ReleaseMutex(hMutex);
    WaitForSingleObject(hMutex,INFINITE);
    if(tickets>0)
    {
    Sleep(1);
    cout<<”thread1 sell ticket : “<<tickets–<<endl;
    }
    else
    break;
    ReleaseMutex(hMutex);
    }*/

    WaitForSingleObject(hMutex,INFINITE);
    cout<<”thread1 is running”<<endl;
    return 0;
    }

    DWORD WINAPI Fun2Proc(
    LPVOID lpParameter // thread data
    )
    {

    /*while(TRUE)
    {
    //ReleaseMutex(hMutex);
    WaitForSingleObject(hMutex,INFINITE);
    if(tickets>0)
    {
    Sleep(1);
    cout<<”thread2 sell ticket : “<<tickets–<<endl;
    }
    else
    break;
    ReleaseMutex(hMutex);
    }*/
    WaitForSingleObject(hMutex,INFINITE);
    cout<<”thread2 is running”<<endl;
    return 0;
    }

留下一个回复