Am 11.08.2015 um 16:27 schrieb Antonio Scuri:
>   Maybe you can try the IDLE and see how it behaves.
> 
>   There is also another possibility. The IDLE callback is somewhat
> equivalent of
> 
> while(IupLoopStep() != IUP_CLOSE)
> {
>   do something
> }

Not too bad.  Though that's essentially the loop my program is sitting in.

"do something" would be in my app "1. do Iup-Calls 2. poll i/o"

But if I don't have *any* IupFlush in there, than I don't see any
progress ever.  That's confusing me.


>   But this is also high CPU consuming.
> 
>   So, to avoid this, you can try:
> 
> while(IupLoopStepWait() != IUP_CLOSE)
> {
>   do something
> }
> 
>   But I would start with the IDLE. In GTK is much better handled than in
> Windows.
> 
> Best,
> Scuri
> 
> 
> On Tue, Aug 11, 2015 at 11:09 AM, "Jörg F. Wittenberger" <
> joerg.wittenber...@softeyes.net> wrote:
> 
>> Sorry again.
>>
>> I've been distracted and did not read to the end of your message.
>>
>> Am 11.08.2015 um 15:39 schrieb Antonio Scuri:
>>>   Ok. Now I see.
>>>
>>>   IupFlush is usually used when you need to processes messages after
>>> changing elements attributes that need to be updated by the system.
>>>
>>>   I would recommend using IupMainLoop and something else for the database
>>> connections, not the way around using IupFlush.
>>>
>>>  There are several ways how to pool secondary systems:
>>>
>>> - Use a second thread to processes it (frequently used)
>>
>> That's the "complicated" way I can see.  Have an embeddes
>> Lua-Interpreter executed dynamically generated Lua code.
>>
>>> - Use a IupTimer to check from time to time if there is something to be
>>> processed on it (limited by a minimum time interval for not too fast
>>> processing)
>>
>> That's what we startet with.  But since I can't make the timer return
>> "right now", it will hopelessly slow down the application.  To no
>> usable.  Example: e few hundred results to be read from the database and
>> display in a matrix.  Takes forever while Iup is sitting most of the
>> time in idle until the timer will check for i/o and notice a new item.
>>
>>> - Use the IDLE callback to process it (high CPU use since it will be
>>> running all the time)
>>
>> As you said: that's the CPU hook.  I read that in the docs and thought
>> there must be a better way.
>>
>> Sorry again for the incomplete reply before.
>>
>> /Jörg
>>
>>>
>>> Best,
>>> Scuri
>>>
>>>
>>>
>>>
>>> On Tue, Aug 11, 2015 at 10:11 AM, "Jörg F. Wittenberger" <
>>> joerg.wittenber...@softeyes.net> wrote:
>>>
>>>> Sorry for following up on my own message.
>>>>
>>>> I just considered the problem again and got stuck.
>>>>
>>>> Am 11.08.2015 um 14:04 schrieb "Jörg F. Wittenberger":
>>>>> Am 10.08.2015 um 19:20 schrieb Antonio Scuri:
>>>>>>   Well, I really don't know.
>>>>>>
>>>>>>   Just know that the calls are not actually "active all at the same
>>>> time".
>>>>>> When you call IupFlush in one of them, it will stop that one,
>> processes
>>>> the
>>>>>> pending messages one by one, then return to that one. If that can
>> occur
>>>>>> recursively then it is a real nightmare to manage. You will have a
>> hard
>>>>>> time to know what is the order that things are happening.
>>>>>
>>>>> Ah' I see.
>>>>
>>>> Maybe I don't really see.
>>>>
>>>> So when exactly SHOULD I call IupFlush?  Which one is the strategy
>>>> natural to Iup.  Changing the app side of things is simple.  There is
>>>> not so much to change by now.  I'm still exploring/learning the toolkit.
>>>>
>>>> So far the first strategy I tried was to simply run IupMainLoop and call
>>>> Iup functions from the callbacks.
>>>>
>>>> This did work as long as there Iup was the only source of events to be
>>>> considered.  But there is some i/o going on (database connections etc.).
>>>>  So I switched to the next strategy :
>>>>
>>>> 2nd: In a loop
>>>>   1. Call all Iup* things to build the GUI as app logic suggests at this
>>>> point in time.
>>>>   2. Call IupFlush.  (Former version: call IupLoopStep and IupFlush if
>>>> that does not return IUP_CLOSE, but that seemed to add no value over
>>>> just IupFlush.)
>>>>   3. Poll other I/O for a moment.  Goto 1 processing the results.
>>>>
>>>> This did work most of the time, but sometimes it would just not result
>>>> in updates as expected.  Turned out some calls (I don't recall which one
>>>> it where) would executed in (1.) call callbacks again.  (I recall having
>>>> read about this in the docs, so no surprise here so far.)
>>>>
>>>> At this point I had to do wild guess work how I should handle this.
>>>>
>>>> Option A:  Record the callbacks job to be execute later and return
>>>> immediately.
>>>> Option B: Execute the Job right now.
>>>>
>>>> The former resulted eventually in the segfaults during IupFlush in step
>>>> (2).  To I settled so far on Option B.  But this required me to Call
>>>> IupFlush also in the recursive invocation.
>>>>
>>>>
>>>> So, to repeat myself: which strategy is natural to Iup?
>>>>
>>>> When must I call IupFlush?
>>>>
>>>> As I'm reading your reply, I'd understand that calling IupFlush from
>>>> withing callbacks is no good idea, correct?
>>>>
>>>> If so: how would I make those changes take effect?  Because: if I call
>>>> "too many" (whatever that is _I_ have no way to know) Iup* things (e.g.
>>>> IupDestroy) from within a single callback, then I get the segfault.
>>>>
>>>>
>>>> Thanks so much
>>>>
>>>> /Jörg
>>>>
>>>>
>>>>>
>>>>> Maybe it's a good idea to add a remark pointing this out in the manual.
>>>>>  Me, reading the manual, gathered that calling IupFlush would never
>>>>> hurt, just advance the processing at the Iup side of things.
>>>>>
>>>>>>   I would recommend you to get a step back are rethink that strategy.
>>>>>
>>>>> So far this never became a strategy.  It failed straight in the first
>>>>> experiment.  It's just my missunderstanding of the docs and an
>>>> experiment.
>>>>>
>>>>>> Independent from IUP, or other toolkits, what you are trying to
>>>> implement?
>>>>>
>>>>> There is a very simple RDF/DublinCore inspired inventory application
>> for
>>>>> a small archive (archive of physical things, kind of a museum - not the
>>>>> family of file formats).  I'm using it as "personal wiki" for my notes
>>>> too.
>>>>>
>>>>> The original is a web app.  I'm trying replace the Web-Interface with a
>>>>> native GUI.
>>>>>
>>>>> /Jörg
>>>>>
>>>>>
>>>>>> Best,
>>>>>> Scuri
>>>>>>
>>>>>>
>>>>>> On Sat, Aug 8, 2015 at 9:58 AM, "Jörg F. Wittenberger" <
>>>>>> joerg.wittenber...@softeyes.net> wrote:
>>>>>>
>>>>>>> ((Sorry, this is not exactly the message I want to reply to, but at
>>>>>>> least it's the correct thread.  (The other message is already gone
>>>> here.)))
>>>>>>>
>>>>>>> I managed to understand the problem a little better.
>>>>>>>
>>>>>>> Maybe I'm dong something against the philosophy of correct Iup usage
>>>> here?
>>>>>>>
>>>>>>> What's happened is that the action callback from my apps back-button
>> is
>>>>>>> called as often as I click it.  Eventually my action callback will
>> also
>>>>>>> call IupFlush.  (Is this a No-No?)  This IupFlush in turn enables the
>>>>>>> next action callback to be activated.  Thus there are 4-5 calls
>> active
>>>>>>> at the same time.
>>>>>>>
>>>>>>> Each of those calls does essentially the same: recreate scrollbox
>> full
>>>>>>> of controls (from different data sets).  Then detach the (only) child
>>>> of
>>>>>>> the target container, IupDestroy that detached child, IupAppend the
>> new
>>>>>>> one and IupRefresh the container.
>>>>>>>
>>>>>>> Since the data set is different, those action callback take a
>> different
>>>>>>> amount of time (while waiting for the data base etc.).
>>>>>>>
>>>>>>> By throwing in some additional calls to IupFlush into the code (I'd
>>>>>>> believe this _should_ not hurt, shouldn't it?) I've been able to get
>> it
>>>>>>> all mixed up.  Up to the point that controls belonging to different
>>>> data
>>>>>>> sets / callbacks ended up mixed into the same container.
>>>>>>>
>>>>>>> To put it in other words: those nested action callbacks in
>> combination
>>>>>>> with IupFlush enabled me to (accidentally) implement a kind of green
>>>>>>> threads on top of Iup.  Unfortunately without proper locking.
>>>>>>>
>>>>>>> Having too few IupFlush's there will result in the segfault.  More
>>>>>>> flushes make it appear to work.  Even more flushes confuse the layout
>>>>>>> logic.
>>>>>>>
>>>>>>> How should this being done right?
>>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>> /Jörg
>>>>>>>
>>>>>>> Am 05.08.2015 um 10:50 schrieb "Jörg F. Wittenberger":
>>>>>>>> Hi Antonio,
>>>>>>>>
>>>>>>>> during IupFlush my program dumped a core like this:
>>>>>>>>
>>>>>>>> Program terminated with signal SIGSEGV, Segmentation fault.
>>>>>>>> #0  0x4097693a in gtkCanvasSetDXAttrib.part.3 () from
>>>>>>>> /usr/local/lib/libiup.so
>>>>>>>> (gdb) bt
>>>>>>>> #0  0x4097693a in gtkCanvasSetDXAttrib.part.3 () from
>>>>>>>> /usr/local/lib/libiup.so
>>>>>>>> #1  0x00000000 in ?? ()
>>>>>>>>
>>>>>>>>
>>>>>>>> Anything I can do to help debugging that one?
>>>>>>>>
>>>>>>>> Best
>>>>>>>>
>>>>>>>> /Jörg


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

Reply via email to