如何处理接收大批量数据?

sdudubing 2013-07-12 07:10:24
现在写的程序,底层采用VC++写的采集接口,利用回调函数机制和消息机制将采集到数据转发给delphi做进一步的处理,目前处理小批量数据没有问题,但是数据量增大时,程序界面卡死。由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死。。。大虾们有啥建议?
...全文
451 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
JohnYale 2013-07-14
  • 打赏
  • 举报
回复
如果不能把数据接收程序放在子线程中 可以考虑把界面程序放在子线程中。不过这样和delphi习惯不一样
JohnYale 2013-07-14
  • 打赏
  • 举报
回复
没看到DLL的数据接收函数 应该是DLL负责接收数据吧
JohnYale 2013-07-14
  • 打赏
  • 举报
回复
请问下 DLL是接收完数据再通知delphi呢 还是只是通知delphi去接收数据? 在你的程序中 你感觉接收数据费时间还是处理数据费时间?
JohnYale 2013-07-13
  • 打赏
  • 举报
回复
我觉得改动不多就能在另一线程中处理 假定子线程为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;
sdudubing 2013-07-13
  • 打赏
  • 举报
回复
引用 9 楼 JohnYale 的回复:
给子线程发消息是很容易的 用PostThreadMessage就行:PostThreadMessage(ThreadID, YOUR_MESSAGE, 0, 0);用法和PostMessage相似。 在子线程中使用 while GetMessage(....)do 获得消息 另外 能把回调函数的定义贴出来吗
修改后,得重新注册控件,但是线程名称不能只写成某一具体名称。这该如何操作?
sdudubing 2013-07-13
  • 打赏
  • 举报
回复
引用 3 楼 JohnYale 的回复:
[quote=引用 楼主 sdudubing 的回复:] ...由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死。。。大虾们有啥建议?
即便是控件的方式 设计好了 也是可以把它放在子线程中的 不用担心。[/quote] 在子线程中使用控件该如何操作?
sdudubing 2013-07-13
  • 打赏
  • 举报
回复
引用 13 楼 JohnYale 的回复:
我觉得改动不多就能在另一线程中处理 假定子线程为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控件?
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 9 楼 JohnYale 的回复:
给子线程发消息是很容易的 用PostThreadMessage就行:PostThreadMessage(ThreadID, YOUR_MESSAGE, 0, 0);用法和PostMessage相似。 在子线程中使用 while GetMessage(....)do 获得消息 另外 能把回调函数的定义贴出来吗
另外,我想问下PostThreadMessage(ThreadID, YOUR_MESSAGE, 0, 0);中的线程ID如何获取啊,线程我是使用TThreadl类。
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 9 楼 JohnYale 的回复:
给子线程发消息是很容易的 用PostThreadMessage就行:PostThreadMessage(ThreadID, YOUR_MESSAGE, 0, 0);用法和PostMessage相似。 在子线程中使用 while GetMessage(....)do 获得消息 另外 能把回调函数的定义贴出来吗
不知道我将的是不是这回事儿,底层代码不是我写的,是借用的别人的,所以可能将的不清楚。
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 9 楼 JohnYale 的回复:
给子线程发消息是很容易的 用PostThreadMessage就行:PostThreadMessage(ThreadID, YOUR_MESSAGE, 0, 0);用法和PostMessage相似。 在子线程中使用 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);这个改成向线程中发送消息,在线程完成事件处理应该可以改善下。
JohnYale 2013-07-12
  • 打赏
  • 举报
回复
给子线程发消息是很容易的 用PostThreadMessage就行:PostThreadMessage(ThreadID, YOUR_MESSAGE, 0, 0);用法和PostMessage相似。 在子线程中使用 while GetMessage(....)do 获得消息 另外 能把回调函数的定义贴出来吗
yayongm 2013-07-12
  • 打赏
  • 举报
回复
应该是子现成处理数据,然后通知主线程处理状态和结果...把耗时运算放到子线程中...主线程只处理必要的显示和控制...
lhy 2013-07-12
  • 打赏
  • 举报
回复
是不是处理太复杂?或者消息太多,一次把很多数据打包发送cpu处理会简单一些。
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 JohnYale 的回复:
[quote=引用 楼主 sdudubing 的回复:] ...由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死。。。大虾们有啥建议?
即便是控件的方式 设计好了 也是可以把它放在子线程中的 不用担心。[/quote] 我想着要是能给子线程类发送消息,然后绑定一个事件就好了,但是不知道具体如何实施。。。
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 JohnYale 的回复:
[quote=引用 楼主 sdudubing 的回复:] ...由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死。。。大虾们有啥建议?
即便是控件的方式 设计好了 也是可以把它放在子线程中的 不用担心。[/quote] 您好,能给将述下?我采用的是消息机制来触发控件的事件,但是消息又得依托于窗体,而线程类又没有窗体...那该怎么办呢?
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 JohnYale 的回复:
[quote=引用 楼主 sdudubing 的回复:] ...由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死。。。大虾们有啥建议?
即便是控件的方式 设计好了 也是可以把它放在子线程中的 不用担心。[/quote] 该如何操作?能讲述下吗?
JohnYale 2013-07-12
  • 打赏
  • 举报
回复
引用 楼主 sdudubing 的回复:
...由于将VC++接口做成VCL控件形式,某前只能在主线程接收数据。我想实现界面不卡死。。。大虾们有啥建议?
即便是控件的方式 设计好了 也是可以把它放在子线程中的 不用担心。
sdudubing 2013-07-12
  • 打赏
  • 举报
回复
引用 1 楼 delphi_freeman 的回复:
给点儿建议吧,咋优化下啊
随行的太阳 2013-07-12
  • 打赏
  • 举报
回复

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧