读书人

请教各位怎么利用线程间通信实现这样

发布时间: 2012-02-09 18:22:27 作者: rapoo

请问各位大虾,如何利用线程间通信实现这样一个功能?
请问各位大虾,小的有礼了!!

本人想实现这样一个例子,以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;
}

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

读书人网 >C语言

热点推荐