How to use Windows Message Loop and Qt Application Exec?
-
Hi Everyone,
I'm new to Qt and am using it with the Canon SDK for a camera application.
There problem is that the Canon SDK requires the same thread that spawns the SDK to also run the windows message loop:
MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
However, the thread that initializes the SDK initializes it in my GUI initialization and runs the Qt Application exec() function.
Is there a way I can handle windows messages from this thread?
I want to keep the Camera class with the SDK initialize as part of my class that extends QMainWindow but I'm not sure how to get the messages handled properly.
Thanks all!
-
Hi and welcome to devnet,
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
Hope it helps
-
Hi Everyone,
I'm new to Qt and am using it with the Canon SDK for a camera application.
There problem is that the Canon SDK requires the same thread that spawns the SDK to also run the windows message loop:
MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
However, the thread that initializes the SDK initializes it in my GUI initialization and runs the Qt Application exec() function.
Is there a way I can handle windows messages from this thread?
I want to keep the Camera class with the SDK initialize as part of my class that extends QMainWindow but I'm not sure how to get the messages handled properly.
Thanks all!
-
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
-
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; }
-
@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 -
@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 -
@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. -
@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. -
@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?
-
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. :)
-
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(); }
-
@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.
-
@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.
-
@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 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....
-
@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....