工作线程中数据如何传递给界面线程?

yztgx 2004-03-17 06:57:06
我在工作线程中进行数据处理,想把处理后的结果发送到界面上的ListCtrl中,如何来做,有什么好的建议

我现在用两种方法,一种全局变量,另外使用PostMessage,但感觉都不是很好,

先谢过
...全文
264 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yztgx 2004-03-19
  • 打赏
  • 举报
回复
自己顶一下:-)
蒋晟 2004-03-19
  • 打赏
  • 举报
回复
去看MFC的MTGDI示例吧……
yztgx 2004-03-19
  • 打赏
  • 举报
回复
?你是
xiaohonghong 2004-03-19
  • 打赏
  • 举报
回复
你呀
XXandOO 2004-03-18
  • 打赏
  • 举报
回复
SendMessage和PostMessage的区别在于,前者线程等待函数返回后者不等待。
MSDN:
SendMessage:It calls the window procedure for the specified window and does not return until the window procedure has processed the message.
PostMessage:function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
netxray 2004-03-18
  • 打赏
  • 举报
回复
把工作线程的函数做成界面线程所在类的成员函数(静态)不就可以了么
yztgx 2004-03-18
  • 打赏
  • 举报
回复
谁能解释这两个问题,有答案就结帖

如何确定两个线程是不是同一个堆栈

一定是要在堆上分配内存,什么意思,怎样是在堆上分配内存?
yztgx 2004-03-18
  • 打赏
  • 举报
回复
呵呵,谢谢各位了

决定还是使用全局变量+PostMessage
netxray 2004-03-18
  • 打赏
  • 举报
回复
to: yztgx(静风)
最好不要直接传递界面线程中界面元素的指针给工作线程.
记得好像候捷翻译的那本说win32线程的书中说过这个问题,说是不会保证什么什么来着,喝喝记不得了
A_Qiao 2004-03-18
  • 打赏
  • 举报
回复
我的方法:
1. 定义一个全局的变量,用来存放工作线程和界面线程要交换的数据
2. 把界面线程的窗口指针传给工作线程,比如 pInterfaceWnd ;
3. 要交换数据的时候,先把数据放入全部变量中,然后给界面线程的窗口发消息
pInterfaceWnd->PostMessage( ... )
4. 在界面线程中处理这个消息,从全局变量得到数据,如何解释和使用这个数据,就是你自己的事情了。
5. 为了更加安全,全局变量的读写可以加上同步处理。
6. 我用的消息是WM_COMMAND, 自定义一个命令ID(不要跟已经存在的重复),这样就省了自定义消息的麻烦。
yztgx 2004-03-18
  • 打赏
  • 举报
回复
to netxray(倦意的笑容)
我正是用的你这个方法,不过我是定义了一个类AA

在AA中定义了一个成员变量m_pListCtrl
将m_pListCtrl指针指向界面线程中的ListCtrl

使用m_pListCtrl->SetItemText(),停止在这里,进入MFC,发现停在SendMessage处
netxray 2004-03-18
  • 打赏
  • 举报
回复
在头文件里:
static DWORD WINAPI _InitGrid(CTestDlg* pThis);线程函数
BOOL InitialGrid();//真正的操作
实现文件里面
DWORD CTestDlg::_InitGrid(CTestDlg* pThis)
{
pThis->m_bEnableAction = FALSE; //防止做两次
pThis->InitialGrid();
pThis->m_bEnableAction = TRUE;
return TRUE;
}

在按钮的click消息响应函数里面
if (m_bEnableAction )
CWinThread* pThread = AfxBeginThread((AFX_THREADPROC)_Download, this);
else
AfxMessageBox(TEXT("请稍后"), MB_OK | MB_ICONEXCLAMATION);

这样根本就不用考虑发送数据到list,就当直接处理list是一样的,不过用了个线程来处理
yztgx 2004-03-18
  • 打赏
  • 举报
回复
to netxray(倦意的笑容)

我就是这么做的,但是代码执行到ListCtrl.SetItemText这里就停了

如果使用WaitForMultipleObjects加入延时退出,ListCtrl.SetItemText将成功(不知道为什么,不好控制,所以不能将就)

to weirdy(软件设计师)
如何确定两个线程是不是同一个堆栈

to kof99th(小虫)
一定是要在堆上分配内存,什么意思,怎样是在堆上分配内存?
netxray 2004-03-18
  • 打赏
  • 举报
回复
to yztgx(静风) :
你说的是不错,不过我们可以不在静态函数里面直接访问view或者dialog的成员变量啊,传一个当前view或者dialog的指针进去不就可以自由访问了么?
kof99th 2004-03-18
  • 打赏
  • 举报
回复
应该是把listctrl的父窗口(一定是要在堆上分配内存的)的指针当参数传到工作线程中的
xenke 2004-03-18
  • 打赏
  • 举报
回复
因为窗口控件的执行线程与工作线程用的不是同一个堆栈!
yztgx 2004-03-18
  • 打赏
  • 举报
回复
静态函数里面的使用的成员变量也需要是静态

谢谢各位的指点,我明白了一些

不过使用ListCtrl.SetItemText,程序就会死在这儿,这是怎么一会事呢



yztgx 2004-03-17
  • 打赏
  • 举报
回复
我将界面的ListCtrl指针传递到工作线程中,使用ListCtrl.SetItemText,程序就会死在这儿,怎么回事呢
xstring 2004-03-17
  • 打赏
  • 举报
回复
SendMessage不会造成阻塞的,应该是您程序中其他的问题造成的阻塞
yztgx 2004-03-17
  • 打赏
  • 举报
回复
使用SendMessage会造成阻塞,不知道怎么回事?
加载更多回复(2)

15,472

社区成员

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

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