Ola,

IupLoopStep is not for multithreading purposes, it is for allowing queued
Windows messages to pass through to other apps that are waiting for Windows
messages. This usually happens when you do something, say like draw 10,000
ellipses, which takes a long time, and during that time other apps will run
slowly or not at all because they might be waiting for Windows messages.
Notice how it has nothing to do with the GUI.


If you want to pause or interrupt a thread, follow the directions given here:
https://docs.microsoft.com/en-us/dotnet/standard/threading/pausing-and-resuming-threads.
Notice it has nothing to do with the GUI.


If you want to communicate with a thread (usually via pipes), follow the
directions given here:
https://docs.microsoft.com/en-us/windows/win32/ipc/interprocess-communications.
Notice it has nothing to do with the GUI.


Regards,
Andrew


On 2019-07-04 at 2:58 PM, Antonio Scuri <antonio.sc...@gmail.com> wrote:
 Hi, 


  The thread situation is generally used when the application actually do
multiprocessing of somehow.


> What do IUP users typically do when they have a long running process they
need to provide UI feedback on, but can't break the long running process up
into time slices suitable for IupTimer?


  Just for a long running process, to free the interface and allow the user to
interact with a cancel button for instance, you just have to call IupLoopStep
from inside your long loop. Calling IupLoopStep several times will allow the
events to be processed. You can implement a counter for instance, that
displays progress by calling a function from inside your loop and in that
function call IupLoopStep and also update a IupGauge or IupProgressBar in your
interface. 


Best,
Scuri








Em qui, 4 de jul de 2019 às 18:29, Matthew Kennedy <burnsid...@gmail.com>
escreveu:

I'm a bit stumped on how to communicate with the IUP thread from another
thread.



Are the options basically polling from idle action, or an IupTimer callback? I
measured the idle action overheard and it's basically 8% of a CPU core and so
an IupTimer seems better. If I use an IupTimer though, I'll need to pick a
timer rate. I could queue up the functions I want to run on the main thread
and drain the queue on a single IupTimer callback, though.


Another approach perhaps is to set a semaphore on the non IUP thread when
assigning the idle function (i.e. when calling IupSetFunction for IDLE_ACTION)
and then signaling the semaphore on the IUP thread from *within the callback*
just before it returns IUP_IGNORE. This has it's own problems though, since
the callback's not really complete until IUP_IGNORE *is* returned. Hmmm...


What do IUP users typically do when they have a long running process they need
to provide UI feedback on, but can't break the long running process up into
time slices suitable for IupTimer?


Matt









On Thu, Jul 4, 2019 at 2:31 PM Antonio Scuri <antonio.sc...@gmail.com> wrote:

  No, there isn't. Once the idle is set, it will be called the next time the
MainLoop regain control. But your are setting from another thread so the
mainloop is running. Maybe the solution would be to set the idle in the main
loop thread where you can have more control about that. 


Best,
Scuri




Em qui, 4 de jul de 2019 às 15:18, Matthew Kennedy <burnsid...@gmail.com>
escreveu:

Hi,


I've trawled through the mailing list archives trying to research this. I hope
I haven't missed a solution to this already:


I have IUP's main-loop running on thread, and I have another thread that needs
to update something in the GUI. I gather it's not safe to call IUP functions
from a NON IUP main-loop thread, so I've settled on acquiring a lock on and
setting the IUP idle function to a function that includes the work needed to
be performed by the non IUP main-loop thread (returning IUP_IGNORE, so as to
run once).



This works pretty well, but I believe if the NON IUP main-loop thread sets IUP
idle function faster than the idle function is called by IUP, then my IUP idle
functions will not always be called. Is there a way to set the idle function
and wait for it to be called? Or even some way to set the idle function and
trigger it to run immediately?



Matt

_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users
_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to