jimdgar
asked on
Why doesn't XtAppProcessEvent keep a Work Process running?
I'm running C/Motif on Unix (Solaris).
I have an app where I call a function which does intensive processing and can run for minutes. This of course locked up the GUI (I'm using XtAppMainLoop). I wanted to avoid any forks to run this lengthy function, so my solution was to embed the following code inside the function such that it got called a few times per second:
while XtAppPending (main_app))
XtAppProcessEvent (main_app, XtIMAll);
This worked great at freeing up the GUI main window. However, it had an unintended side affect. I have a work process running to display the status of the lengthy function. The work process runs OK until the lengthy function is entered, then it freezes until the function is done.
Is there a way to keep this work process running?
I have an app where I call a function which does intensive processing and can run for minutes. This of course locked up the GUI (I'm using XtAppMainLoop). I wanted to avoid any forks to run this lengthy function, so my solution was to embed the following code inside the function such that it got called a few times per second:
while XtAppPending (main_app))
XtAppProcessEvent (main_app, XtIMAll);
This worked great at freeing up the GUI main window. However, it had an unintended side affect. I have a work process running to display the status of the lengthy function. The work process runs OK until the lengthy function is entered, then it freezes until the function is done.
Is there a way to keep this work process running?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Sorry for not answering his further questions.
(1) Threads will help, as i/o isnt needed then, as all global variables and file streams are shared between all threads. So you don't have to pipe the i/o around, but you do have to ensure with a few interlocks that several threads arent trying to simultaneously read or write.
For interlocks you can use something as fancy as system mutexes or as simple as carefully set and checked flags.
(2) No, main doesnt have to wait for a thread unless it wants to. I think they;re referring to not exiting main() until you're sure the threads have doine everything you want them to do.
(3) I think threads are mostly portable to Linux. There's probably some little details that are slightly different but if you stick to simple things there should be little problem.
(1) Threads will help, as i/o isnt needed then, as all global variables and file streams are shared between all threads. So you don't have to pipe the i/o around, but you do have to ensure with a few interlocks that several threads arent trying to simultaneously read or write.
For interlocks you can use something as fancy as system mutexes or as simple as carefully set and checked flags.
(2) No, main doesnt have to wait for a thread unless it wants to. I think they;re referring to not exiting main() until you're sure the threads have doine everything you want them to do.
(3) I think threads are mostly portable to Linux. There's probably some little details that are slightly different but if you stick to simple things there should be little problem.
ASKER
grg99,
Thanks for responding. Incidentally, I got advice (away from this board) to avoid Threads if possible. So, I stuck with the "XtAppPending" and "XtAppProcessEvent" usage and got rid of the work process. For my particular application this works fine.
jimdgar
Thanks for responding. Incidentally, I got advice (away from this board) to avoid Threads if possible. So, I stuck with the "XtAppPending" and "XtAppProcessEvent" usage and got rid of the work process. For my particular application this works fine.
jimdgar
ASKER
1) I previously solved the "lengthy function" problem using popen to fork a separate process. This worked fine except i/o was a pita and giving the user the ability to abort the function was tedious. If I use pthread, does it solve these issues? Are stdin, stdout, etc. in the Thread the same as in the main, or do I need to pipe them?
2) The quick POSIX Threads tutorial I just read says that main should wait until a thread is complete to continue (use pthread_join). If main is waiting, doesn't this lockup the XtMainAppLoop and put me right back where I was?
3) Will a Unix thread implementation port over to Linux? I've seen some postings which state that you must use fork on Linux.
Thanks