首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请教各位,怎么利用线程间通信实现这样一个功能

2012-02-09 
请问各位大虾,如何利用线程间通信实现这样一个功能?请问各位大虾,小的有礼了!!本人想实现这样一个例子,以m

请问各位大虾,如何利用线程间通信实现这样一个功能?
请问各位大虾,小的有礼了!!
       
        本人想实现这样一个例子,以main()函数为主线程,在主线程中创建一个子线程,该子线程执行一定的条件代码,当条件满足时就向主线程发送一个消息,主线程接到消息后就作相应的处理,小的无法实现这样的功能,请教各位大虾了!
        我在这里就写了点自己的想法,但该代码不能实现!呜呜呜!请大虾们指点!

#define   WM_DISPLAY   WM_USER+2                       //自定义消息
DWORD   mainThreadId;                                         //全局变量用于存放主线程的id
DWORD   WINAPI   ThreadProc1(   LPVOID   lpParam   )         //子线程
{  
      int   i   =   0;
      BOOL   f;
      do
      {
printf( "in   the   ThreadProc,   %d\n ",i);
if(i%2   ==0)
                    {
      f   =   PostThreadMessage(mainThreadId,   WM_DISPLAY,   NULL,NULL);     //希望能够向主线程传递消息
                    }
                      i++;
        }   while(1);
        return   1;
}  

int   main()
{
      HANDLE   hThread;        
      DWORD   dwThreadId;
      LPMSG   lpMsg;
      BOOL   flag;

      mainThreadId   =   GetCurrentThreadId();     //希望获得该主线程的id号,以便自线程传消息
      //创建一个子线程
      hThread   =   CreateThread(  
NULL,                             //   default   security   attributes
0,                                   //   use   default   stack   size    
ThreadProc1,               //   thread   function  
&i,                                 //   argument   to   thread   function  
0,                                   //   use   default   creation   flags  
&dwThreadId);             //   returns   the   thread   identifier  

      if   (hThread   ==   NULL)     //查看是否创建成功
      {
              ExitProcess(i);
      }

        flag   =   GetMessage(lpMsg,   NULL,   0,0);   //希望能够获得来自子线程的消息,从而进行相应的处理
        ........                                                          

        //   Close   all   thread   handles   upon   completion.
        CloseHandle(hThread);


        return   1;
}

[解决办法]
MSG msg;
...
flag = GetMessage(&msg, NULL, 0,0);
[解决办法]
up
[解决办法]
为啥不看看线程的同步
[解决办法]
你可以使用Windows的 "事件 "
[解决办法]
建议你用Windows的Event
在main中创建一个事件:
HANDLE hEvt=CreateEvent(...);
然后将这个hEvt作为子线程的参数创建子线程:
__beginTread(ThreadProc,hEvt);
然后就等待这个信号:
while(1)
{
WaitForSingleEvent(hEvt,INIFINE);//等待信号
ResetEvent(hEvt);//复位信号
//执行你的操作
//结束判断
}

子线程条件满足时:SetEvent(hEvt);//置信号


由于我机器上现在没有安装任何的开发工具,所以有些拼写可能有错误,不能给你完整的说出参数等,请你自行查阅msdn中平台SDK的同步部分

[解决办法]
ACE_Task
[解决办法]
你是新手么
如果你觉得事件 共享内存通讯 
复杂又麻烦的话
可以使用最简单实用的线程通讯方法
就是利用一个全局变量来通信

[解决办法]

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
HANDLE hEvent;
bool IsEventCalled = false;
DWORD WINAPI ThreadProc1( LPVOID lpParam )
{
int i = 0;
do
{
if(IsEventCalled)
{
printf( "事件已经被响应!\n ");
system( "PAUSE ");
}
printf( "in the ThreadProc, %d\n ",i);
if(i==50000)
{
printf( "i=50000,满足事件响应条件,调用SetEvent()\n ");
SetEvent(hEvent);
}
i++;
} while(1);
return 1;
}

int main()
{
HANDLE hThread;
DWORD dwThreadId;
LPMSG lpMsg;

hEvent = CreateEvent(NULL, FALSE, FALSE, "hEvent ");
printf( "设置了事件,但还没得到响应 ");
system( "PAUSE ");

hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc1, // thread function
0, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier

if (hThread == NULL) //查看是否创建成功
{
ExitProcess(0);
}
WaitForSingleObject(hEvent,INFINITE);
IsEventCalled = true;

{
//做你要做的事情。。
//在事件响应之前,这里以后的代码不会被执行到
}
// Close all thread handles upon completion.
CloseHandle(hThread);
return 0;
}

[解决办法]
我觉得使用全局变量通信更实用。。
尤其象楼主这样的新手。

热点排行