请教多线程的规划设计? 因为大部分VCL都不是线程安全的,不支持多线程,所以当你使用了TThread对象的时候,最好把界面更新的部分放到一个方法中,然后在线程的Execute方法中调用Synchronize(Your GUI Method);这样才能做到VCL同步 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用Event CreateEvent, ResetEvent, SetEvent通过WaitFor函数来等待这个Event触发,一个线程CreateEvent,有数据后SetEvent, 另一个线程WaitFor这个Event,当SetEvent后,取得这个线程的数据,然后ResetEvent或用PostThreadMessage,然后在另个线程中建立一个消息队列,PeekMessage/GetMessage数据可以通过Thread里面的域的数据,也可以通过PostThreadMessage将数据的指针传给另一个线程 请教:若用TEvent,每当有数据后,SetEvent,若不断的产生数据,就不断的SetEvet,可以吗?我不太清楚,请指点? 在写入时,触发事件而在线程中,用WaitForSingleObject 我在程序中试用了TEvent,确实能提高CPU的利用率。但我还有如下的问题:我的系统中有四路数据输入,我做了一个线程来对获取的四路数据进行处理,当某一路有数据来时,就SetEvent,我要用四个Event呢,还是一个,如何处理这个问题?谢谢! 看来你只需要四个线程通知一个线程,用一个Event就行了。如果虽然是一个处理线程,不同的数据来源处理不同,那还是用四个Event更清晰简便一些。 有四个数据来源,用一个线程处理,每当有数据来是就SetEvent;我用了一个Event,但处理四路时总是出错,而处理一路是又没问题。为什么? 四路数据存放到teslist时没采用同步会出错。 考虑了同步!问题出在利用一个Event来处理四路数据,每当一路有数据时就SetEvent一次。 用四个EventWaitFor不是有个WaitForMultpleObjects等待多个Handle, //等待4个var Event: array [0..3] of THandle;Event[0] := CreateEvent(...); //线路1....case WaitForMultipleObjects(4, @Event[0], , False, INIFITINE, QS_ALLINPUT) of WAIT_OBJECT_0: ;//第一个线路的Event触发 WAIT_OBJECT_0 + 1: ;//第二个线路的Event触发 WAIT_OBJECT_0 + 2: ;//第三个线路的Event触发 WAIT_OBJECT_0 + 3: ;//第四个线路的Event触发else ErrorProc;// end;如果不想用Event,嫌它多的话,可以用:SemaphoreCreateSemaphore, ReleaseSemaphore, 和WaitFor的组合它是像计数器一样,限定资源的数量,通过WaitFor, ReleaseSemaphore来得到和Release资源计数器 简单点的办法,在线程中适当加些Sleep() 你不是定时查询吗?在每次查询后sleep一下。也许就好了。 你不是定时查询吗?在每次查询后sleep一下。也许就好了。 我用了两组各四个TEvent,当有数据来时,对应通道获取数据后,TEvent。setevent,向数据处理线程发出处理信号,当数据处理线程处理数据后,获取有需要的信息,则又由相应的Event.setevent,控制线程获取信息后开始处理。在实际系统运行中,我发现实时性达不到要求。当数据处理线程产生需要的信息后,往往要几秒钟后控制线程才有响应。请教问题出在那里?如何改进? 在线程中加 Sleep(n); n 单位是毫秒,n > 0。你可以 Sleep(100), 0.1 秒的延迟应该可以接受。 试一下将线程的优先级稍高点试下。WaitFor在Windows我也总觉得有延迟。:( 怎么判断StringGrid中当前选中的单元格? IHtmlFramesCollection2为何得不到iframe得内容呢 请教 ClientDataSet--------> AppendData 的奇怪问题 关于WebBrowser1的问题 怎末做帮助文件 ? 请问:什么叫“交叉报表” 有两个问题想请教? 窗体的互相引用的问题 .db是什么类型的数据库? ADO能操作它吗? 它能支持一库多表吗? 再问天下Delphi英雄: 在整数转换到指定长度的字符的时候,如何将不齐长度的前面加0? 紧急求助
CreateEvent, ResetEvent, SetEvent
通过WaitFor函数来等待这个Event触发,一个线程CreateEvent,有数据后SetEvent,
另一个线程WaitFor这个Event,当SetEvent后,取得这个线程的数据,然后ResetEvent
或用PostThreadMessage,然后在另个线程中建立一个消息队列,PeekMessage/GetMessage
数据可以通过Thread里面的域的数据,也可以通过PostThreadMessage将数据的指针传给另一个线程
而在线程中,用WaitForSingleObject
如果虽然是一个处理线程,不同的数据来源处理不同,那还是用四个Event更清晰简便一些。
WaitFor不是有个WaitForMultpleObjects等待多个Handle,
//等待4个
var
Event: array [0..3] of THandle;Event[0] := CreateEvent(...); //线路1
....case WaitForMultipleObjects(4, @Event[0], , False, INIFITINE, QS_ALLINPUT) of
WAIT_OBJECT_0: ;//第一个线路的Event触发
WAIT_OBJECT_0 + 1: ;//第二个线路的Event触发
WAIT_OBJECT_0 + 2: ;//第三个线路的Event触发
WAIT_OBJECT_0 + 3: ;//第四个线路的Event触发
else
ErrorProc;//
end;
如果不想用Event,嫌它多的话,可以用:
Semaphore
CreateSemaphore, ReleaseSemaphore, 和WaitFor的组合
它是像计数器一样,限定资源的数量,通过WaitFor, ReleaseSemaphore来得到和Release资源计数器
在每次查询后sleep一下。也许就好了。
在每次查询后sleep一下。也许就好了。
WaitFor在Windows我也总觉得有延迟。:(