怎样保持主线程和分线程同步(100分)

  • 主题发起人 主题发起人 cslegend
  • 开始时间 开始时间
C

cslegend

Unregistered / Unconfirmed
GUEST, unregistred user!
主线程要读取分线程中处理出来的数据,
请问主线程怎样等待分线程的完成,(主线程是一个函数)。
我使用了IntializeCriticalSection()(临界区)和互斥等几种方法,
可是都不能停止主线程的运行。哪位大侠知道?谢谢了。
 
能否贴点你的代码出来,看看你到底怎么处理的.
var Critical1:TRTLCriticalSection;
Critical Section在使用前要先,一般放在表单创建之时
InitializeCriticalSection(Critical1);
使用后不用时要:一般放在表单关闭时
DeleteCriticalSection(Critical1);
使用前要:
EnterCriticalSection(Critical1);
完后要:
LeaveCriticalSection(Critical1);
例:
procedure TThread.Execute;
begin
EnterCriticalSection(Critical1);
try
...
finally
LeaveCriticalSection(Critical1);
end;
Synchronize(Method: TThreadMethod);
end;
我这儿有一个多线程的范例,你要的话,请留下Email.
 
>>主线程怎样等待分线程的完成
你也可以在分线程完成时发一个消息给主线程
 
试一试WaitForSingleObject
 
TO:zhangkan
谢谢了!
我的程序本意是校正单片机时间。客户点击“时间校正”按钮,然后返回校正成功的数据。流程大概是:先发送一个时间矫正的指令给单片机,然后读单片机返回串口的数据,最后将数据显示在EDIT控件中。(都是在JUDGETIME函数中)
本来可以使用单线程来做这个程序,但是可能是由于我的程序有问题,没有什么例子,所以我使用多线程。
代码大概如下:
Function JudgeTime():String;
begin
SendData('Com1');
//发送读时间指令给单片机
ReadData('Com1');
//读取单片机发送到串口的数据
Sleep(5000);
//延时5秒等待消息处理函数读完串口数据。
.......
.......
Result:=读出的串口数据。
end;

ReadData()创建一个监视线程ComWatch监视串口。等待数据。
procedure CommWatch(Ptr:Pointer);Stdcall;
begin

.......
While (Receive)do
begin

dwEvtMask:=0;
If Not WaitCommEvent(Hcom,DwEvtMask,@Os) then
begin
if Error_IO_PENDING=GetLastError then
GetOverLappedResult(Hcom,Os,DwTranser,True);
//问题出在这,执行这句话后就跳到主函数中去了。等主函数
执行完后才执行消息处理函数。
end;
if (DwEvtMask and Ev_Rxchar)=Ev_RxChar then
begin
WaitForSingleObject(Post_Event,Infinite);
resetEvent(Post_Event);
Ok:=PostMessage(FrmScom.Handle,Wm_Commnotify,Hcom,0);
//消息处理函数省略了。
if NOt Ok then
begin
ShowMessage('Error');
Exit;
end;
end;
end;
end;
我昨天在JUDGETIME()函数中使用InitializeCriticalSection
在监视程序中使用DeleteCriticalSection和EnterCriticalSection;
但是主线程没有停止,执行了几句话后才执行分线程(监视程序)(并不是主执行完后才执行分线程)。今天我使用SLEEP()后主线程停止了,但是分线程执行到我上面所说的那句话后有回到主线程了。
我的Email是Cslegend@etang.com
谢谢了。
 
使用事件(Event)可以解决这个问题。
var
g_hEvent : THandle;
// 全局变量
...
Function JudgeTime():String;
begin
// 创建一个Event
// 注意:创建的这个事件是手动,且初始值没有信号(non-signal)
g_hEvent:= CreateEvent(nil,TRUE,FALSE,nil);

SendData('Com1');
//发送读时间指令给单片机
ReadData('Com1');
//读取单片机发送到串口的数据
WaitForSingleObject(g_hEvent,INFINITE);
// 等待事件变成有信号
....
CloseHandle(g_hEvent);
// 若不使用这个事件了,把它关闭
.......
Result:=读出的串口数据。
end;

procedure CommWatch(Ptr:Pointer);Stdcall;
begin

.....
// 若要主线程结束等待
SetEvent(g_hEvent);
......
end
关于事件的详细信息,参考Windows编程有关书籍
 
To:各位
问题早就解决了,但由于很少上DFW,所以拖到现在还没给分对不起了。
不过试了很多方法,我最后还是改用单线程了。
 
后退
顶部