How to use Windows Message Loop and Qt Application Exec?
-
@arablau I meet the same problem. Could you please tell me how to solve it?
-
Hi @YJCN,
have you read the (still existing, wow!) links @SGaist recommended?
You might be interested by QWidget's "winEvent":http://qt-project.org/doc/qt-4.8/qwidget.html#winEvent or QCoreApplication's "winEventFilter":http://qt-project.org/doc/qt-4.8/qcoreapplication.html#winEventFilter
Regards
-
@aha_1980 Thanks for your reply. I have read the links. In Qt5, the winEvent has been changed to nativeEvent. This is my code.But it doesn't work.
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) { //Q_UNUSED(eventType); MSG* msg = reinterpret_cast<MSG*>(message); cout<<"in nativeEvent:"<<msg->message<<endl; if(msg->message==275) { //GetMessage(msg, NULL, NULL, NULL); TranslateMessage(msg); cout << "TranslateMessage" << endl; DispatchMessage(msg); // Ends up calling objectEventFnc cout << "DispatchMessage" << endl; return true; } return false; }
-
@YJCN said in How to use Windows Message Loop and Qt Application Exec?:
But it doesn't work
What exactly doesn't work?
"Note: Events are only delivered to this event handler if the widget is has a native Window handle." from http://doc.qt.io/qt-5/qwidget.html#nativeEvent -
@jsulm I use the Canon EDSDK to control the EOS 800D. I want to download image from camera. after taking picture. In EDSDK, the download is handled by callback function. I test in command line programm ,and there must be this code after sending a take picture command. Otherwise, the programm can't enter the callback funtion.
MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
There is the reason I find in Google.
If you're using the EDSDK on Windows, you have to have a Windows message loop in your main thread, otherwise callbacks won't happen. (This is because the EDSDK uses the obsolete COM STA threading model instead of real threads.)
https://social.microsoft.com/Forums/en-US/a431209c-be99-4394-88b3-59879cb790a4/objecteventhandler-callback-nevercalled?forum=Offtopic
https://stackoverflow.com/questions/16839640/edsdk-callbacks-not-working/18624865 -
@YJCN
Hi
in case that nativeEvent simply cannot work with decade-old COM crap (1998)
there is always the options of using a plain c++ app that will handle the downloading / save to file and
you simply call it with QProcess from Qt GUI app. -
@mrjj The Canon 's demo is using MFC. Why MFC could use?
-
@YJCN said in How to use Windows Message Loop and Qt Application Exec?:
Why MFC could use?
Because it is Microsofts own GUI framework using the Windows event loop...
-
@YJCN
MFC is very old too :)Anyway i wonder with that line
if(msg->message==275)
means ? where did u get this magic number from ?
-
@mrjj
This my CMD programm codeint main (){ EdsCameraRef camera; EdsUInt32 tv; init_camera(camera); //start_liveview(camera); //TakePicture(camera); take_photo(camera,1,1000); //TakePhoto(); //dispose(camera); cout << "before message" << endl; MSG msg; while (GetMessage(&msg, NULL, NULL, NULL)) { cout << "in while" << " msg.message:"<<msg.message<<endl; TranslateMessage(&msg); cout << "TranslateMessage" << endl; DispatchMessage(&msg); // Ends up calling objectEventFnc cout << "DispatchMessage" << endl; break; } cout << "after message" << endl; EdsCloseSession(camera); cout << "EdsCloseSession(camera);"; EdsTerminateSDK(); system("pause"); return 0;
This is output
-
HI
ahh, so 275 is the ID for what SDK is doing.
So you call
init_camera(camera); in main window also ?
(and take_photo(camera,1,1000);
and camera is a member variable in main window so it doesn't run out of scope?but you never see 275 ? in natvieEvent?
-
@mrjj Yes. I put the code(init_camera(camera) and take_photo(camera,1,1000) ) in Button's slot function, after taking picture, the programm can't enter callback function(handleObjectEvent) and there is no 275 in natvieEvent.
-
Hi
and just to be 100% sure
camera is NOT a local variable in Button's slot function, but in the .h file as a true member of
main maindiw (in .h file) ?
(im checking its not a death by scope issue)If unsure what i ask, please show full Button's slot function. :)
-
@mrjj This is Button's slot function code
void MainWindow::on_pushButton_2_clicked() { EdsCameraRef camera; init_camera(camera); //start_liveview(camera); //TakePicture(camera); take_photo(camera,1,1000); //TakePhoto(); //dispose(camera); cout << "before message" << endl; MSG msg; while (::GetMessage(&msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); // Ends up calling objectEventFnc break; } cout << "after message" << endl; EdsCloseSession(camera); cout << "EdsCloseSession(camera);"; EdsTerminateSDK(); }
-
@YJCN said in How to use Windows Message Loop and Qt Application Exec?:
while (::GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg); // Ends up calling objectEventFnc
break;
}You execute this loop only once (because of the break).
Shouldn't you call break after you got the message you need?@mrjj camera is local :-) but I don't thin this is the issue here.
-
@jsulm
I agree, it should not run out of scope if it works like we think :)
But you are right, maybe it just get first MSG as then it breaks. -
@jsulm said in How to use Windows Message Loop and Qt Application Exec?:
Shouldn't you call break after you got the message you need?
Indeed, the loop picks up the first message and that's it. What makes you think that message is the right/only one which needs to be processed this way? It could be any old message....
-
-
@YJCN
You have to do more than just comment out thebreak
, if that's what you're saying. If that's all you do the::GetMessage()
loop will never exit, and your code will never return fromon_pushButton_2_clicked()
, e.g. you cannot press it again to take another photo. Presumably you need to find out whatever is the final message your camera issues on taking a photo and exit the loop once that has been received. -
@JonB Yes. I just use a five times for loop to solve it . ^_^