机器有4个COM串口程序开启四个线程,一个线程对应一个串口,每个线程的操作内容都是从数据库表里取。 问题是: 假如20条数据就用四个线程来处理, 就得循环5次。 每写一个COM数据,得四个线程写成功了才能下一轮操作.若有人提供算法,多线程技术. 本人提供1000分, 并赠送1000元作为酬劳
解决方案 »
- 如何读取文本文件中的换行符
- WebBrowser打开页面提示错误"Interface not supported",为什么呢?
- 重金求够 地磅称重软件 源码
- delphi8的配置
- 有点难度~~高手进来看看(想给1000分的)
- 手动阀试一试
- 在DBGRIDEH中设置了Footer并且有3个,怎么对应一列的每个FOOTER赋值
- 如何比较Edit控件和数据库中的数字大小,并输出差额??
- 如何用标准的SQL书写如下语句:
- 谁会使用DELPHI编写驱动级的程序出来聊聊吧
- delphi7中TClientDataSet的Locate问题
- DM.DSetTemp.FieldByName('Timemute').AsInteger ; ‘’is not a valid integer value.
猛料中的一段代码,供参考。
unit comdemou;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;constWm_commNotify=Wm_User+12;type TForm1 = class(TForm)procedure FormCreate(Sender: TObject); privateProcedure comminitialize;Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify;{ Private declarations } public{ Public declarations } end; //线程声明 TComm=Class(TThread) protectedprocedure Execute;override; end;var Form1: TForm1; hcom,Post_Event:Thandle; lpol:Poverlapped;implementation{$R *.DFM}Procedure TComm.Execute;//线程执行过程vardwEvtMask:Dword;Wait:Boolean;Beginfillchar(lpol,sizeof(toverlapped),0);While True do Begin dwEvtMask:=0; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //等待串行口事件; if Wait Then Beginwaitforsingleobject(post_event,infinite); //等待同步事件置位;resetevent(post_event);//同步事件复位;PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//发送消息;end; end;end;procedure Tform1.comminitialize;//串行口初始化varlpdcb:Tdcb;Beginhcom:=createfile(‘com2’,generic_read or generic_write,0,nil,open_existing, file_attribute_normal or file_flag_overlapped,0);//打开串行口if hcom=invalid_handle_value thenelsesetupcomm(hcom,4096,4096); //设置输入、输出缓冲区皆为4096字节getcommstate(hcom,lpdcb);//获取串行口当前默认设置lpdcb.baudrate:=2400;lpdcb.StopBits:=1;lpdcb.ByteSize:=8;lpdcb.Parity:=EvenParity;//偶校验Setcommstate(hcom,lpdcb);setcommMask(hcom,ev_rxchar); //指定串行口事件为接收到字符;end;Procedure TForm1.MsgcommProcess(Var Message:Tmessage);varClear:Boolean;Coms:Tcomstat;cbNum,ReadNumber,lpErrors:Integer;Read_Buffer:array[1..100]of char;BeginClear:=Clearcommerror(hcom,lpErrors,@Coms);if Clear Then Begin cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //处理接收数据 SetEvent(Post_Event);//同步事件置位 end;end;procedure TForm1.FormCreate(Sender: TObject);begincomminitialize;post_event:=CreateEvent(nil,true,true,nil); //创建同步事件;Tcomm.Create(False);//创建串行口监视线程;end;end.
用一个线程扫描数据库数据,比如一次取20条。
然后放到一次一条放到各COM通讯线程的数据区域,通过WaitForMultiObjects + Wait For All。当WaitForMultiObjects返回之后再循环下去。