Beiträge: 666
Themen: 77
Registriert seit: Oct 2013
Bewertung:
0
Du bist aber sparsam was deine Auskünfte angeht....
Originalhardware oder emuliert ?
Beiträge: 396
Themen: 8
Registriert seit: Sep 2013
Bewertung:
0
Also wenn du einen Refresh erziwngen willst, dann wäre ntui_SendEvent{*object_that_needs_refresh, #TUIEV_REFRESH} das Richtige.
Ein künstliches Notify einführen nur wegen dem Refresh ist nicht nötig/sinnvoll, im Gegenteil. Dein PostNotify muss sich ja "hinten anstellen", möglicherweise warten noch andere blockierende Notifes.
Das eigentliche Problem ist, dass du den Main Thread blockierst.
Richtig wäre, die Scan Funktion frei von Blitz Befehlen, Strings und lokalen NewTypes zu machen, weil die nicht threadsafe sind.
Dann kannst du sie asyncrhon aufrufen und dir einen Notify schicken lassen wenn es fertig ist. Die GUI bleibt dann solange responsiv.
Du kannst Threadsafety auch erzwingen wenn du es in ein eigenes Tool packst, so wie ich den AB3Scanner.
Dann kannst du diese Funktin benutzen, die ich auch in NTUI reinpacken werden, momentan ist sie direkt in AIDE definiert:
Function.l ntui_RunAsyncAndNotify{*obj.tuiObject,exe.s,params.s,outfile.s,notifyId.s,value.l,string.s}
Das ruft eine <exe> auf, mit <params> als Parameter, die Ausgabe wird in die Datei <outfile> geschrieben. Nachdem es fertig ist wird dem Objekt <*obj> ein <notifyId> mit <value> und <string> Anhang geschickt.
Sowas macht man nicht unbedingt für jede kleine Funktion, aber wenn es aufwendiger ist oder man ein 3rd party tool nutzen will ist das recht elegant.
So kann man nämlich das Tool stand-alone entwickeln und debuggen. AB3 ist wie gesagt nicht für Multithreading ausgelegt und der Debugger läuft Amok, d.h. er muss für alle Threads ausser dem Main Thread ausgeschaltet sein, und man ist sehr eingeschränkt was man machen darf.