當收到WM_COPYDATA訊息時,如何 "即時 "回傳一個回應,并同時呼叫一個函式?
我嘗試使用chrono,但是發送訊息的應用程式只能在sendCommand函式被執行后收到一個回應。
#include <thread>
#include <future>
#include <iostream>
void sendCommand(std::chrono:seconds delay, std::string cmd)
{
std::this_thread::sleep_for( delay ) 。
std::cout << "
等待的命令是=" << cmd。
}
switch ( msg)
{
case WM_COPYDATA:
{
OutputDebugStringW(L"
WM_COPYDATA!")。)
PCOPYDATASTRUCT pcds = reinterpret_cast<PCOPYDATASTRUCT>(lParam)。
//....
auto s1 = std::async(std:: launch::async, sendCommand, std:: chrono::seconds(5), "Command1")。)
return 1;
}
uj5u.com熱心網友回復:
如果你不介意封鎖收到WM_COPYDATA的執行緒,你可以簡單地使用ReplyMessage():
#include <iostream>
void sendCommand(std::chrono:seconds delay, std::string cmd)
{
std::this_thread::sleep_for( delay ) 。
std::cout << "
等待的命令是=" << cmd。
}
switch ( msg)
{
case WM_COPYDATA:
{
OutputDebugStringW(L "WM_COPYDATA!") 。
PCOPYDATASTRUCT pcds = reinterpret_cast<PCOPYDATASTRUCT>(lParam)。
//...。
ReplyMessage(1)。
sendCommand(std::Chrono::seconds(5), "Command1") 。
return 1;
}
uj5u.com熱心網友回復:
你要找的東西被稱為lambda函式(https://en.cppreference.com/w/cpp/language/lambda),看起來像這樣:
使用std::thread:
std::thread t([] )
{
sendCommand(std::Chrono::seconds(5), "Command1") 。
})。
使用std::async 解決方案,通過捕獲它,未來的壽命被延長到lambda的壽命。 如果你在windows/msvc上,這有一個小小的好處,就是可以使用執行緒池中的執行緒。否則就使用執行緒解決方案吧。
#include < memory>
auto ft = std::make_shared<std::future<void>>()。
*ft = std::async(std::launch::async, [ft] )
{
sendCommand(std::Chrono::seconds(5), "Command1") 。
});
uj5u.com熱心網友回復:
在這個答案中,我假設你不想丟棄由WM_COPYDATA發送的資料,但你希望你所呼叫的函式能夠訪問這些資料。
如果您允許WM_COPYDATA處理程式在回傳之前復制資料,那么就沒有必要使用多執行緒來解決這個問題。
WM_COPYDATA處理程式可以做的是
- 動態分配用于復制資料的記憶體,
- 然后實際復制資料。
- 然后實際復制資料, 。
- 然后使用
PostMessage發布一個包含指向復制資料的指標的用戶定義的訊息到訊息佇列, - 然后立即回傳,無需呼叫函式來處理資料。
當在執行緒的訊息回圈中稍后處理用戶定義的訊息時,用戶定義的訊息的處理程式可以呼叫該函式來處理資料,然后在該函式回傳后,釋放動態分配的資料。
有必要在WM_COPYDATA處理程式中復制資料,因為一旦處理程式回傳,資料的指標就會失效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/331305.html
標籤:
