当前位置: 代码迷 >> VC/MFC >> 【议论】工作线程刷新对话框界面,什么方式好些?为什么?
  详细解决方案

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

热度:181   发布时间:2016-05-02 03:37:32.0
【讨论】工作线程刷新对话框界面,什么方式好些?为什么??
先预祝大家放假快乐,呵呵

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

请问:
1:还有什么方式?
2:所有方式哪种最好?
3:为啥???
------解决思路----------------------
貌似也就这三种方法吧

第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了
------解决思路----------------------
(1)对话框传给线程函数窗口句柄,线程函数发消息给对话框。
(2)对话框传给线程函数this指针,线程函数通过this指针调用对话框成员函数
(3)线程函数调用对话框提供的回调函数

界面操作应该只有方案1是可行的,2、3 GDI操作必须使用同步机制,否则可能会崩溃
------解决思路----------------------
没详细研究过,一直用的是第一种。不过句柄这东西确实是浅拷贝,就像你线程读写同一个文件写日志医院,必须用同步机制
------解决思路----------------------
引用:
没详细研究过,一直用的是第一种。不过句柄这东西确实是浅拷贝,就像你线程读写同一个文件写日志医院,必须用同步机制


使用1方案不需要同步
------解决思路----------------------
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx

------解决思路----------------------
你所说的方法未考虑数据安全,而保证数据安全是一个程序必须的,否则随时可能崩溃。你所说的线程和界面属于不同的线程,从安全角度看只有使用消息机制是正确的。当然,其它方法使用时你锁定窗口(同步)也是可以的,但会产生额外的资源浪费。
------解决思路----------------------
引用:
貌似也就这三种方法吧

第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了


把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。
------解决思路----------------------
引用:
Quote: 引用:

貌似也就这三种方法吧

第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了


把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。


SendMessage和UpDateWindow是同步函数啊,它们会直接调用窗口的处理过程,直到处理过程跑完才返回
------解决思路----------------------
引用:
Quote: 引用:

貌似也就这三种方法吧

第一种发消息的方式应该最合理,至少它是异步的,当然,若是调用SendMessage或者UpDateWindow等就不是异步了


把对话框的窗口句柄传给线程函数,接下来不就是为线程函数SendMessage或者UpDateWindow做准备吗?此时为什么不是异步?请解释下。


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. 


------解决思路----------------------
引用:

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,虽然该消息会被立即执行,但这个“立即执行”也是相对的,毕竟窗口处理过程函数灰常繁琐,消息需要一步一步的判断、分发、参数格式化等等过程,经历“两万五千里长征”之后才最终得以执行啊,肯定比不了你直接用指针去调函数的
  相关解决方案