【讨论】工作线程刷新对话框界面,什么方式好些?为什么??

tiger波波 2015-09-28 10:01:49
先预祝大家放假快乐,呵呵

我目前用过的有:
(1)对话框传给线程函数窗口句柄,线程函数发消息给对话框。
(2)对话框传给线程函数this指针,线程函数通过this指针调用对话框成员函数
(3)线程函数调用对话框提供的回调函数

请问:
1:还有什么方式?
2:所有方式哪种最好?
3:为啥???
...全文
222 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2015-10-08
  • 打赏
  • 举报
回复
引用 2 楼 youyingbo 的回复:

try
	{
		GetLocalTime(&st);
		str.Format(_T("%2d:%2d:%2d"),st.wMinute,st.wSecond,st.wMilliseconds);
		strTime = str;

		for (i=0; (i<5000)&&m_bThreadWork; i++)
		{
			str = _T("");
			str.Format(_T("%08d"), i);

			UpdateUserInterfaces(str);
		}

		GetLocalTime(&st);
		str.Format(_T(" -- %2d:%2d:%2d"),st.wMinute,st.wSecond,st.wMilliseconds);
		strTime += str;

		AfxMessageBox(strTime);
	}
	catch(...)
	{
		
	}
我试了下这段代码,发消息用了811毫秒,传句柄用了804
我试了下这段代码,发消息用了811毫秒,传句柄用了804 ---------------------------------------------------------------------------------- 传句柄?是传指针吧? 如果是传指针的话,这个是正常的,发消息的方式,比如PostMessage,是把消息发到目标窗口(的消息队列),如果消息队列中该消息前面还有好多消息正在等待处理,或者说加上这个消息的优先级比较低的话........ 即便是你使用同步发消息函数SendMessage,虽然该消息会被立即执行,但这个“立即执行”也是相对的,毕竟窗口处理过程函数灰常繁琐,消息需要一步一步的判断、分发、参数格式化等等过程,经历“两万五千里长征”之后才最终得以执行啊,肯定比不了你直接用指针去调函数的
rxguoblp 2015-10-03
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
[quote=引用 8 楼 rxguoblp 的回复:] [quote=引用 1 楼 lsq19871207 的回复:] 貌似也就这三种方法吧 第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。[/quote] SendMessage会在处理完消息之后再返回 If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message. [/quote] 明白了,谢谢
rxguoblp 2015-10-03
  • 打赏
  • 举报
回复
引用 9 楼 lsq19871207 的回复:
[quote=引用 8 楼 rxguoblp 的回复:] [quote=引用 1 楼 lsq19871207 的回复:] 貌似也就这三种方法吧 第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。[/quote] SendMessage和UpDateWindow是同步函数啊,它们会直接调用窗口的处理过程,直到处理过程跑完才返回[/quote] 明白了,谢谢
worldy 2015-09-29
  • 打赏
  • 举报
回复
引用 8 楼 rxguoblp 的回复:
[quote=引用 1 楼 lsq19871207 的回复:] 貌似也就这三种方法吧 第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。[/quote] SendMessage会在处理完消息之后再返回 If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message.
信阳毛尖 2015-09-29
  • 打赏
  • 举报
回复
引用 8 楼 rxguoblp 的回复:
[quote=引用 1 楼 lsq19871207 的回复:] 貌似也就这三种方法吧 第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。[/quote] SendMessage和UpDateWindow是同步函数啊,它们会直接调用窗口的处理过程,直到处理过程跑完才返回
rxguoblp 2015-09-29
  • 打赏
  • 举报
回复
引用 1 楼 lsq19871207 的回复:
貌似也就这三种方法吧 第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。
worldy 2015-09-28
  • 打赏
  • 举报
回复
(1)对话框传给线程函数窗口句柄,线程函数发消息给对话框。 (2)对话框传给线程函数this指针,线程函数通过this指针调用对话框成员函数 (3)线程函数调用对话框提供的回调函数 界面操作应该只有方案1是可行的,2、3 GDI操作必须使用同步机制,否则可能会崩溃
tiger波波 2015-09-28
  • 打赏
  • 举报
回复

try
	{
		GetLocalTime(&st);
		str.Format(_T("%2d:%2d:%2d"),st.wMinute,st.wSecond,st.wMilliseconds);
		strTime = str;

		for (i=0; (i<5000)&&m_bThreadWork; i++)
		{
			str = _T("");
			str.Format(_T("%08d"), i);

			UpdateUserInterfaces(str);
		}

		GetLocalTime(&st);
		str.Format(_T(" -- %2d:%2d:%2d"),st.wMinute,st.wSecond,st.wMilliseconds);
		strTime += str;

		AfxMessageBox(strTime);
	}
	catch(...)
	{
		
	}
我试了下这段代码,发消息用了811毫秒,传句柄用了804
信阳毛尖 2015-09-28
  • 打赏
  • 举报
回复
貌似也就这三种方法吧 第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
笨笨仔 2015-09-28
  • 打赏
  • 举报
回复
你所说的方法未考虑数据安全,而保证数据安全是一个程序必须的,否则随时可能崩溃。你所说的线程和界面属于不同的线程,从安全角度看只有使用消息机制是正确的。当然,其它方法使用时你锁定窗口(同步)也是可以的,但会产生额外的资源浪费。
赵4老师 2015-09-28
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
worldy 2015-09-28
  • 打赏
  • 举报
回复
引用 4 楼 luxiaolai861227 的回复:
没详细研究过,一直用的是第一种。不过句柄这东西确实是浅拷贝,就像你线程读写同一个文件写日志医院,必须用同步机制
使用1方案不需要同步
处处留心 2015-09-28
  • 打赏
  • 举报
回复
没详细研究过,一直用的是第一种。不过句柄这东西确实是浅拷贝,就像你线程读写同一个文件写日志医院,必须用同步机制

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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