界面线程和工作线程

eatsweetpotato 2010-03-21 09:36:53
书上说,在工作线程里不要做跟界面有关的东西,但我老师不明白,怎么样的行为称得上是和界面有关

假如,一个工作线程用于进行数据传输,那么如果需要传输的数据时需要从控件中读取,那么这个从控件读取数据的动作,算不算是和界面有关?
...全文
203 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kingstarer 的回复:]
读取控件的数据不需要开线程吧 耗时较长的操作才需要
[/Quote]


不仅读取,还要发送;
有时候数据量较大
yuzl32 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 eatsweetpotato 的回复:]
引用 11 楼 kingstarer 的回复:
读取控件的数据不需要开线程吧 耗时较长的操作才需要



不仅读取,还要发送;
有时候数据量较大
[/Quote]
那就难怪了,发送操作应该由工作线程去处理,不应该由界面线程处理。
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
确如healer_kx所说,不调试一切正常,一调试,卡死
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
本人初学,不知我的做法是否正确

如蠢勿哀之


UINT CSendFileDlg::SendFileThread( LPVOID lparam )
{
CSendFileDlg *pthisDlg = (CSendFileDlg*)lparam;
SOCKET SocketRecv = pthisDlg->m_SendSocket;
CFile tmp_ReadFile;

::SendMessage(pthisDlg->m_hWnd , WM_SENDFILEINFO , 0 , 0);
// 发送完消息后,相应函数并没有执行,直接卡死。Postmessage也一样

// ......
}

// SendFileInfo函数用于向接收方发送文件信息(文件名和大小)
LRESULT CSendFileDlg::SendFileInfo( WPARAM wparam , LPARAM lparam )
{
FILEINFO FileInfo;
SOCKET SocketRecv = m_SendSocket;
CFile tmp_ReadFile;
int loopcounter = m_SendFile_List.GetItemCount();


// 向文件接收方发送需要接收的文件目录
for (int i = 0 ; i < loopcounter ; i++)
{
wcscpy_s(FileInfo.FileName ,m_SendFile_List.GetItemText(i , 1));
tmp_ReadFile.Open(m_SendFile_List.GetItemText(i , 3) , CFile::modeRead|CFile::shareDenyNone);
FileInfo.FileSize = tmp_ReadFile.GetLength();
FileInfo.RestFileCount = loopcounter-i-1;

int ret = send(SocketRecv ,(char*)&FileInfo , sizeof(FileInfo),0);

tmp_ReadFile.Close();
}

return 0;
}
healer_kx 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 eatsweetpotato 的回复:]

to healer_kx

不知道是我没用对,还是怎么的
用sendmessage好像有时还是会发生卡死,
[/Quote]

卡死?
跨线程访问UI的时候,消息处理函数应该专注于处理消息,这也符合SRP。
就SendMessage而言,消息处理完,才会返回,这个处理过程也不适宜太复杂,太耗时。


第二,再看看是不是有什么同步机制影响了。

多线程调试是很麻烦,有时候调试器还容易死掉,多试验几个断点位置吧。
至善者善之敌 2010-03-22
  • 打赏
  • 举报
回复
界面线程和工作线程最大的区别就是一个有消息循环队列,http://www.programfan.com/article/2951.html看看这个!
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
to healer_kx

不知道是我没用对,还是怎么的
用sendmessage好像有时还是会发生卡死,
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 healer_kx 的回复:]
看我这个系列blog的第一篇。
http://www.cnblogs.com/healerkx/category/199400.html
[/Quote]
好东西
traceless 2010-03-22
  • 打赏
  • 举报
回复
呵呵 是的,我脑子一下子转不过弯来。。。

我就说嘛,人家都是说 我小弟之类的,突然来了个, 我老师。。。
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 traceless 的回复:]
Faint。。。


引用楼主 eatsweetpotato 的回复:
但我老师不明白


。。。
[/Quote]

晕。

看来,输入法的联想,有时也是用字不当的始作俑者
traceless 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 taodm 的回复:]

那个,mfc或者说windows原生控件,都没有设计为线程安全,都只能在一个线程,也就是界面线程中访问。
[/Quote]

traceless 2010-03-22
  • 打赏
  • 举报
回复
Faint。。。

[Quote=引用楼主 eatsweetpotato 的回复:]
但我老师不明白
[/Quote]

。。。
healer_kx 2010-03-22
  • 打赏
  • 举报
回复
看我这个系列blog的第一篇。
http://www.cnblogs.com/healerkx/category/199400.html
taodm 2010-03-22
  • 打赏
  • 举报
回复
那个,mfc或者说windows原生控件,都没有设计为线程安全,都只能在一个线程,也就是界面线程中访问。
eatsweetpotato 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yuzl32 的回复:]
引用 12 楼 eatsweetpotato 的回复:
引用 11 楼 kingstarer 的回复:
读取控件的数据不需要开线程吧 耗时较长的操作才需要



不仅读取,还要发送;
有时候数据量较大

那就难怪了,发送操作应该由工作线程去处理,不应该由界面线程处理。
[/Quote]

我没有让界面线程处理数据的发送。

我就是用工作线程来发送信息的,只不过是在线程中获取list控件中的信息然后在发送
kingstarer 2010-03-21
  • 打赏
  • 举报
回复
读取控件的数据不需要开线程吧 耗时较长的操作才需要
jackyjkchen 2010-03-21
  • 打赏
  • 举报
回复
我一般不搞界面线程
某某9 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]

工作线程只负责处理数据,不负责显示
界面线程只负责显示,不负责处理数据
当然,工作线程还是需要从界面中读入输入的数据之类的
[/Quote]顶下
走好每一步 2010-03-21
  • 打赏
  • 举报
回复
界面程序就像c中的while()循环,不断地检测有没有键盘、鼠标等消息。
假如你线程去运行工作的,那么要工作完了才能再检测键盘、鼠标的消息,当然会卡住,
消息发送,没得检测呀。
说了那么多,还是去挑本比较好的《操作系统》看看吧。
我以前也是想破脑袋也不明白的
走好每一步 2010-03-21
  • 打赏
  • 举报
回复
线程的出现的原因。。。。。
看下操作系统会明白很多,不然光用mfc是弄不明白的
加载更多回复(6)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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