多线称中需要调用一个回调函数,回调函数如何控制主对话框中的控件

ISABCJJ 2008-05-12 11:27:11
主对话框某按钮启动一个线程,线程中要调用一个回调函数,回调函数如何控制主对话框中的控件。
代码如下:
//启动线程
void CWinpCapDemoDlg::OnBtnCapture()
{
// TODO: Add your control notification handler code here

_beginthreadex(NULL,0,&CaptureFunc,this,0,&m_thread_id);//启动线程

}

//线程函数
unsigned int WINAPI CWinpCapDemoDlg::CaptureFunc(LPVOID param)
{
int count = 0;

CWinpCapDemoDlg* pDlg = (CWinpCapDemoDlg*)param;
hWnd = ::FindWindow(NULL,"WinpCapDemo" );

pcap_loop(adHandle,1,ETH_Dispatcher_Handler,NULL);//参数3必须为一个回调函数

}

//回调函数
void ETH_Dispatcher_Handler(u_char *, const pcap_pkthdr* header, const u_char *p)
{
PETHHEADER eth = (PETHHEADER)p;
CWinpCapDemoDlg* dlg = new CWinpCapDemoDlg;//发现句柄为空.所以无法操作主对话框的控件
//CWnd::GetDlgItem(IDD_WINPCAPDEMO_DIALOG,&hWnd);
CString strShost,strDhost,strType;
strShost.Format("%02X ",eth->ether_shost);
strDhost.Format("%02X ",eth->ether_dhost);
strType.Format("%02X",htons(eth->ether_type));

//发现句柄为空.所以无法操作主对话框的控件
// dlg.m_ctrlList.InsertItem(0,strShost);
// dlg.m_ctrlList.SetItemText(0,1,strDhost);
// dlg.m_ctrlList.SetItemText(0,2,strType);

}



...全文
105 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ISABCJJ 2008-05-13
  • 打赏
  • 举报
回复
使用你的方法解决了,使用SendMessage()目前没有验证,应该也可以!谢谢3位![Quote=引用 3 楼 lijianli9 的回复:]
可以保存一个全局的dlg变量,在Initdialog的时候初始化,然后就可以在你的回调函数中使用了.
[/Quote]
lijianli9 2008-05-13
  • 打赏
  • 举报
回复
可以保存一个全局的dlg变量,在Initdialog的时候初始化,然后就可以在你的回调函数中使用了.
Microsoft777 2008-05-12
  • 打赏
  • 举报
回复
我最近的程序和你遇到的问题差不多
我用 SendMessage
最好不要用 PostMessage
因为你是多线程
而且还应该给这个回调函数
设置信号量
arong1234 2008-05-12
  • 打赏
  • 举报
回复
不能在这个函数内直接使用该窗口,需要sendmessage到这个窗口,然后由消息处理函数来实际操作
原因见:
http://blog.vckbase.com/arong/archive/2005/12/03/15578.html

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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