现在写的程序,底层采用VC++写的采集接口,利用回调函数机制和消息机制将采集到数据转发给delphi做进一步的处理,目前处理小批量数据没有问题,但是数据量增大时,程序界面卡死。由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死大虾们有啥建议?
解决方案 »
- 读取一个二进制文件中的record内容的问题,高手顺便看下啊,麻烦了!
- 如何防止SQL SERVER的事件跟踪器跟踪软件的脚本?
- 怎样可以实现vclskin皮肤更新,我想在程序里控制它.可以吗 ?
- 我使用showmodal时候出现的错误!
- 三层结构中对数据更新的事务控制问题。
- Delphi用Sybase数据库有的表不能刷新 提示不是唯一索引
- 怎样同时激活两个窗体(两个Form都呈现亮色)
- 大家请多指教(一个连菜鸟也算不上的人留言)
- 谁用过价格只要3999、4999的winbook笔记本?感觉如何,发表一下看法。
- delphi里如何用ado链接sql server 2000
- delphi 如何追加和 读取多个 同结构的配置
- delphi调用WinExec或ShellExecute执行了外部的数据操作,该如何让数据操作完毕后再继续执行delphi里面的代码
在子线程中使用 while GetMessage(....)do 获得消息另外 能把回调函数的定义贴出来吗
在底层VC++中有这么个函数类型:typedef void (CALLBACK* NOTIFYPROC)(LPVOID, ClientContext*, UINT nCode);当有数据信息接收完毕后,使用m_pNotifyProc((LPVOID) m_pFrame, pContext, NC_RECEIVE);来通知delphi层去取数据。
在delphi层有一下代码:procedure TIOCPSEVER1.callback(S:tsocket;Even:integer);stdcall;
begin
PostMessage(FwindowHandle,wm_user+Even,s,0);
end;
在控件初始化时:procedure TIOCPSEVER1.SetActive(const Value: boolean);
begin
if value then
begin
if not FActive then
begin
if init(@TIOCPSEVER1.callback,Fport) then FActive := Value;
end;
end
else
begin
if FActive then
begin
shutdown;
FActive := value;
end;
end;end;
VC++底层初始化时将m_pNotifyProc=TIOCPSEVER1.callbac。消息处理函数:
procedure TIOCPSEVER1.WndProc(var Msg: TMessage);
begin
with msg do
case Msg of
(WM_USER+0):
begin end;
(WM_USER+1):
begin
if Assigned(OnConnect) then
OnConnect(WParam);
end;
(WM_USER+2):
begin
if Assigned(OnDisConnect) then
OnDisConnect(WParam);
end;
(WM_USER+3):
begin
if Assigned(OnTransmit) then
OnTransmit(WParam);
end;
(WM_USER+4):
begin
DoExecute(WParam);
end;
(WM_USER+5):
begin
if Assigned(ONTRANSMITSucess) then
ONTRANSMITSucess(WParam);
end;
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
end;
我想要是能改下TIOCPSEVER1.callback(S:tsocket;Even:integer);这个改成向线程中发送消息,在线程完成事件处理应该可以改善下。
假定子线程为aThread
1 改 procedure TIOCPSEVER1.callback(S:tsocket;Even:integer);stdcall;
begin
PostMessage(FwindowHandle,wm_user+Even,s,0);
end;
为procedure TIOCPSEVER1.callback(S:tsocket;Even:integer);stdcall;
begin
PostThreadMessage(aThread.ThreadID,wm_user+Even,s,0);
end;2 在aThread的类的Execute中做类似如下的处理
TaThread.Execute;
var
msg: TMsg;
begin
while GetMessage(msg, 0, 0, 0) do
begin
with msg do
case Msg.message of
(WM_USER+0):
begin
end;
(WM_USER+1):
begin
OnConnect(WParam);
end;
(WM_USER+2):
begin
OnDisConnect(WParam);
end;
(WM_USER+3):
begin
OnTransmit(WParam);
end;
(WM_USER+4):
begin
DoExecute(WParam);
end;
(WM_USER+5):
begin
ONTRANSMITSucess(WParam);
end;
end;
end;
这个功能基本完成了,但是效果还是不好,我的控件还在主线程中,还是需要主线程来转发消息。控件中引用了VC++写的DLL控件,我想问下能在线程中直接使用DLL控件?
在你的程序中 你感觉接收数据费时间还是处理数据费时间?