多线程数据采集控件(200)

  • 主题发起人 主题发起人 L-M-delphi
  • 开始时间 开始时间
L

L-M-delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我初接触delphi,因项目需要做一个数据采集的控件,不停扫描usb端口,收到数据后产生一个事件,把数据发送出去,自己摸索写了下,用activeform,却在postmessage时产生错误,不能通过,请高手帮看看或者改写下,以下是部分相关代码:另外我的代码在delphi下能很好执行,就是想做成控件时不会了unit FhsUsb372Impl1;{$WARN SYMBOL_PLATFORM OFF}interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ActiveX, AxCtrls, FhsUsb372Proj1_TLB, StdVcl, jpeg, ExtCtrls;const WM_DATA=WM_USER+108;type TFhsUsb372 = class(TActiveForm, IFhsUsb372) Image1: TImage; private { Private declarations } FEvents: IFhsUsb372Events; procedure Data(var msg:TMSG);message WM_DATA; protected { Protected declarations } procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override; procedure EventSinkChanged(const EventSink: IUnknown); override; function Get_AxBorderStyle: TxActiveFormBorderStyle; safecall; procedure Set_AxBorderStyle(Value: TxActiveFormBorderStyle); safecall; function closePort: WordBool; safecall; function openPort: WordBool; safecall; function setPort(wCom: SYSINT): WordBool; safecall; function writePort(const OutS: WideString): WordBool; safecall; function Destory: WordBool; safecall; function MyThreadFunc(P:pointer):Longint;stdcall; public { Public declarations } procedure Initialize; override; end;var hThread:Thandle;//定义一个句柄 ThreadID:DWord; Wcom1:integer; dData:string; //采集的结果implementationuses ComObj, ComServ,CH375DLL;{$R *.DFM}function TFhsUsb372.MyThreadFunc(P:pointer):Longint;//stdcall;//var// buff :pvoid;//之前的处理函数都去掉了,下一行postmessage不能通过,句柄换了好多个都没解决 postmessage(handle,WM_DATA,0,0); Application.ProcessMessages ; end;{ TFhsUsb372 }Procedure TFhsUsb372.Data(var msg:TMSG);begin FEvents.Recieve(12,'abcd') ; localFree(msg.lParam );end ;procedure TFhsUsb372.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);begin { Define property pages here. Property pages are defined by calling DefinePropertyPage with the class id of the page. For example, DefinePropertyPage(Class_FhsUsb372Page); }end;procedure TFhsUsb372.EventSinkChanged(const EventSink: IUnknown);begin FEvents := EventSink as IFhsUsb372Events; inherited EventSinkChanged(EventSink);end;procedure TFhsUsb372.Initialize;begin Wcom1:=0; inherited Initialize;end;function TFhsUsb372.openPort: WordBool;begin if hThread=0 then hthread:=CreateThread(nil,0,@TFhsUsb372.MyThreadfunc,nil,0,ThreadID); if hThread=0 then Result:=false; if hThread<>0 then begin ResumeThread(hThread); // 激活线程 Result:=true; end;end;function TFhsUsb372.Destory: WordBool;begin if hThread<>0 then TerminateThread(hThread,0); // 终止线程 CH375CloseDevice(Wcom1);end;initialization TActiveFormFactory.Create( ComServer, TActiveFormControl, TFhsUsb372, Class_FhsUsb372, 1, '', OLEMISC_INVISIBLEATRUNTIME, //OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL, tmBoth);end.
 
PostMessage不能通过是什么意思?
 
你做了线程处理里吗?在线程里不要用Application.ProcessMessages;
 
PostMessage,如果句柄用handle,直接死掉,其他参数,消息不能被控件接收执行
 
MyThreadfunc 这个函数是线程执行的,你居然敢ProcessMessage, 很可能会导致程序处理界面等等,可是Vcl UI又不是线程安全的,既然又线程为什么还要ProcessMessage?
 
其实我的想法是用一个线程不停的扫描端口,一收到数据就产生一个事件,使调用这个控件的程序进行数据处理,我基本没学delphi,只是凭感觉写的这段代码,如果这个方法不行,能否提供另外的一个方法,最好是有源代码,谢谢
 
我将上面的postmessge改成Synchronize(dat),然后dat中postmessage也不管用,各位大侠帮忙啊!我都愁死了,原来用惯了VB,刚改到delphi,很多不会
 
谁能给我一点具体的帮助吗?谢谢了
 
做了如下修改,依然不行,帮忙看看Procedure TMyThread.dat ;begin postmessage(handle,WM_DATA,0,0);end;Procedure TMyThread.Execute;//stdcall;begin { Place thread code here } Synchronize(dat) ;end;{ TFhsUsb372 }Procedure TFhsUsb372.Data(var msg:TMSG);begin FEvents.Recieve(12,'abcd') ; end ;
 
谁能帮我?万分火急啊
 
兄弟,十多天了,还没有搞定呀。同情中。。。我说个模式://用While做死循环处理(或者另加条件处理)不停的扫描usb端口While True dobegin// do something.//如果得到你想要的数据,向主线程发送消息,MainHandle 为全局变量可以在创建线程前获得;WM_MY_DATA 自定义消息,WM_MD_STATE 为WM_MY_DATA 消息对应的参数。if GetData() then SendMessage(MainHandle, WM_MY_DATA, WM_MD_STATE, 0);//可以适当的加入睡眠。Sleep(50);end;
 
谢谢草原骏马的提示。 只是我实在太愚钝了,改了半天都没有解决,能否向你提出一个过分的要求,帮我写一小段代码,功能是一个小控件,用多线程,子线程从1数到1000时,自动产生一个事件通知调用该控件的程序,让调用它的程序知道数据已经到了1000,根据这个估计我能改出来。再次感谢草原骏马!
 
www.hellocpp.net中国人自己的codeproject资料库
 
找了一个折中的方法,问题总算是解决了,但肯定是一个不好的方法,先凑或着用了,如果哪位有好办法,欢迎讨论。现在散分了。
 
后退
顶部