| |
|
|
| ¡Hola IF...
Yo habs veces getestet y hoffe nichts falso gemacht a haben: KompilierenMarcaSeparación $U thread.pcu = thread.
DEF @GetDlgCtrlID(1) !"USER32","GetDlgCtrlID"
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
Testprogramm Timer
Profan Version 9
$H Windows.ph
-Main----------------------------------------------------------------
Declare Timer_Busy%,Ende%
Declare TimerID&,Create%,T_Text&,Test#
WindowStyle 26
WindowTitle "Timertest PHU-60"
Window 100,100 - 370,200
cls
Let T_TEXT&=@CREATETEXT(%HWND,"",30,30,300,30)
-Menue---------------------------------------------------------------
PopUp "&Programm"
AppendMenu 108,"&Einstellungen"
AppendMenu 109,"&Ende"
Ende% = 0
Timer setzen (4x pro Sekunde, 250ms)
thread.start 1,1
WhileNot Ende%
WaitInput
If @MenuItem(108)
Einstellungen
Endif
If @MenuItem(109)
thread.stopall
Ende% = 1
Endif
Wend
End
-Proc Einstellungen
Proc Einstellungen
Declare hD%, hA%, hB%, OK%, hTime%
Declare hF1%, hT1%
Clear OK%
Dialogfenster erzeugen
hD% = @Create("Dialog",%hWnd,"Einstellungen",%WinLeft+80,%WinTop+155,230,190)
hF1% = @Create("Font","Arial",16,0,0,0,0)
hT1% = @Create("Text",hD%,"Einstellungen...",10,10,220,20)
SetFont hT1%,hF1%
hTime% = @Create("TimeEdit", hD%, "00:00:00", 10, 35, 70, 24)
hB% = @Create("Button",hD%,"&Nachstellen",10,120,100,28)
hA% = @Create("Button",hD%,"&Abbrechen",120,120,100,28)
WhileNot Ok%
WaitInput
If @ButtonClicked(hB%) Nachstellen
Ok% = 1
Aktionen hier
ElseIf @ButtonClicked(hA%) Abbrechen
Ok% = 1
ElseIf (%Key = 2) ALT+F4 bzw. schließen
Ok% = 1
EndIf
EndWhile
DeleteObject hF1%
@DestroyWindow(hD%)
EndProc
-Prozedur die in bestimmten Zeitintervallen ausgefuehrt wird (4x pro Sekunde)
Proc thread.do
parameters n&
Dim Test#,1000000
Inc Timer_Busy%
Locate 5,5
Print "Timer:" + @str$(Timer_Busy%) + " Durchläufe"
Settext T_Text&,"Timer:" + @str$(Timer_Busy%) + " Durchläufe"
ENDPROC
Auch hier se el Ventana no correcto adecuado! Was bedeutet el? Werden en el Hauptprogramm während un hilo ausgeführt, überschreibt Profano intern gespeicherte Variables para Aufrufen de API. Je después de, welche Profanfunktionen en el Hauptprogramm verwendet voluntad, Es el Gefahr veces mehr y veces weniger gegeben, ellos es aber auch (laut Roland) beim direkten Aufrufen de APIs disponible. Wann y si una Fehler auftritt, hängt vom gewählten Zeitintervall, vom Rechner y de el Programmbedienung por el User de. Was bedeutet el genau?
Ein Ejemplo: Beim una Rechner bajo Windows2000 se beim Aufruf el API RegUnloadKey una solcher Crash verursacht y el API se deshalb no korrekt ausgeführt. Daraufhin se el Registryhive des User no como geplant entladen y es beim nächsten Start no mehr verfügbar => una ganzes Userprofile es unwiederbringlich perdido.
Ein anders Ejemplo: Das Hauptprogramm schreibt während una Callback se ejecuta en el Registry. Como alles ungünstig zusammentrifft, se en una otro Schlüssel geschrieben y Datenj en el Registry ir perdido!
Weitere Fragen y Anmerkungen? |
|
|
| |
|
|
|
| Was Usted sagst bedeutet el sobald una Procedimiento, welcher por ProcAddr a una Api transferencia wurde, de uno Api en lugar de de XProfan incluso aufgerufen se, XProfan esto no es korrekt auseinanderhalten kann y Variablenspeicher überschrieben voluntad?
Nun el wäre fatal, especialmente el sí entonces en efecto el FastMode betrifft, y jede APP welcher una propio wProc besitzt así potenziell como muy gefährlich eingestuft voluntad debería. Das betrifft also Callbacks y Subclassing.
Aber Yo tener ne Abhilfe - hoffentlich - como verhält lo si se no Variablenbezeichnung - en keiner Procedimiento - widerholt? Selbe Problema? *después de*Roland*schrei*sólo*el*kanns*wissen*
Wenn mi AbhilfeIdee el problema sin embargo beseitigen debería - entonces hieße lo auch el una rein-en-OOP-basiertes Programa möglicherweise weniger gefährlich ser podría? |
|
|
| |
|
|
|
| Ah Yo sehe auch Usted hast en Deinem Demo una Referencia de No beachtet, welcher besagte el sólo el Waitinput con Hilo.Start y Hilo.Stop umschlossen ser debería!
Yo el Source veces así geändert Yo me vorstelle y empfehle, y siehe como, lo son no Problemas: KompilierenMarcaSeparación $U Thread.pcu = Thread.
Def @Getdlgctrlid(1) !"USER32","GetDlgCtrlID"
Def @Buttonclicked(1) @Getdlgctrlid(@&(1))=-%Menuitem
Testprogramm Timer
Profan Version 9
$H Windows.ph
-Main----------------------------------------------------------------
Declare Timer_busy%,Ende%
Declare Timerid&,Create%,T_text&,Test#
Windowstyle 26
Windowtitle "Timertest PHU-60"
Window 100,100 - 370,200
Cls
Let T_TEXT&=@CREATETEXT(%HWND,"",30,30,300,30)
-Menue---------------------------------------------------------------
Popup "&Programm"
Appendmenu 108,"&Einstellungen"
Appendmenu 109,"&Ende"
Ende% = 0
Timer setzen (4x pro Sekunde, 250ms)
Whilenot Ende%
.waitinput
If @Menuitem(108)
Einstellungen
Endif
If @Menuitem(109)
Ende% = 1
Endif
Wend
End
-Proc Einstellungen
Proc Einstellungen
Declare Hd%, Ha%, Hb%, Ok%, Htime%
Declare Hf1%, Ht1%
Clear Ok%
Dialogfenster erzeugen
Hd% = @Create("Dialog",%Hwnd,"Einstellungen",%Winleft+80,%Wintop+155,230,190)
Hf1% = @Create("Font","Arial",16,0,0,0,0)
Ht1% = @Create("Text",Hd%,"Einstellungen...",10,10,220,20)
Setfont Ht1%,Hf1%
Htime% = @Create("TimeEdit", Hd%, "00:00:00", 10, 35, 70, 24)
Hb% = @Create("Button",Hd%,"&Nachstellen",10,120,100,28)
Ha% = @Create("Button",Hd%,"&Abbrechen",120,120,100,28)
Whilenot Ok%
.Waitinput
If @Buttonclicked(Hb%) Nachstellen
Ok% = 1
Aktionen hier
Elseif @Buttonclicked(Ha%)Abbrechen
Ok% = 1
Elseif (%Key = 2)ALT+F4 bzw. schließen
Ok% = 1
Endif
Endwhile
Deleteobject Hf1%
@Destroywindow(Hd%)
Endproc
-Prozedur die in bestimmten Zeitintervallen ausgefuehrt wird (4x pro Sekunde)
Proc Thread.do
Parameters N&
Dim Test#,1000000
Inc Timer_busy%
Locate 5,5
Print "Timer:" + @Str$(Timer_busy%) + " Durchläufe"
Settext T_Text&,"Timer:" + @str$(Timer_Busy%) + " Durchläufe"
Dispose Test#
Endproc
proc .waitinput
thread.start 1
Waitinput
thread.stopn class=s2>1
ENDPROC
|
|
|
| |
|
|
|
| ¡Hola IF...
Nein, kein Variablenspeicher - el wäre no así schlimm. Mi Erklärung: Wenn una Profanfunktion, z.B. Crear, ausgeführt se, muß Crear sólo una vez auseinandergepflückt voluntad. Lo muß u.a. überprüft voluntad, welche API Crear aufrufen se. Dazu necesario Daten gespeichert y verglichen voluntad. Wenn nun mitten en el vergleich el Callback ausgeführt se (bevor el API aufgerufen wurde), voluntad esta Daten überschrieben y si la Callback zurückkehrt, es hay wo ahora el API Call verglichen voluntad debería, sólo todavía Mist. |
|
|
| |
|
|
|
| Naja aber gehe doch veces el hier de me geschriebene una:
[quote:ca377de2a5]Was Usted sagst bedeutet el sobald una Procedimiento, welcher por ProcAddr a una Api transferencia wurde, de uno Api en lugar de de XProfan incluso aufgerufen se, XProfan esto no es korrekt auseinanderhalten kann y Variablenspeicher überschrieben voluntad?
Nun el wäre fatal, especialmente el sí entonces en efecto el FastMode betrifft, y jede APP welcher una propio wProc besitzt así potenziell como muy gefährlich eingestuft voluntad debería. Das betrifft also Callbacks y Subclassing.
Aber Yo tener ne Abhilfe - hoffentlich - como verhält lo si se no Variablenbezeichnung - en keiner Procedimiento - widerholt? Selbe Problema? *después de*Roland*schrei*sólo*el*kanns*wissen*
Wenn mi AbhilfeIdee el problema sin embargo beseitigen debería - entonces hieße lo auch el una rein-en-OOP-basiertes Programa möglicherweise weniger gefährlich ser podría?[/quote:ca377de2a5] Diese Vermutung de Usted Tuve aber auch ya damals, por lo tanto empfahl Yo en efecto folgendes:
[quote:ca377de2a5]Ah Yo sehe auch Usted hast en Deinem Demo una Referencia de No beachtet, welcher besagte el sólo el Waitinput con Hilo.Start y Hilo.Stop umschlossen ser debería![/quote:ca377de2a5] |
|
|
| |
|
|
|
| Rolands antwort darauf debería eigendlich ser, daß si uno CallBacks nutzt, y/oder el Fastmode, el una continuación sólo reine API escribir darf. Yo glaube aber el daß así no pensamiento es, oder? |
|
|
| |
|
|
|
| ¡Hola IF...
Un gute Concepto en el a umgehen, doch manchmal möchte (muß) uno eben GetMessage uso.
Saludo
Andreas |
|
|
| |
|
|
|
| [quote:14713789fd=Andreas Hötker]¡Hola IF...
Un gute Concepto en el a umgehen, doch manchmal möchte (muß) uno eben GetMessage uso.
Saludo
Andreas[/quote:14713789fd] Ist me klar - pero son nunmal no Función / Procedimiento / Unit / qué De todos modos welche en 100% aller Fälle/Situationen siempre correcto es o. korrekt adecuado es.
Viel schlimmer - tiempos de el thread.pcu abgesehen - finde Todavía todos con el Callbacks! |
|
|
| |
|
|
|
| Wir son also beim Thema XProfansche Critical-Sections angekommen |
|
|
| |
|
|
|
| [quote:a00f5c25f8=iF]Naja aber gehe doch veces el hier de me geschriebene una:
[quote:a00f5c25f8]Was Usted sagst bedeutet el sobald una Procedimiento, welcher por ProcAddr a una Api transferencia wurde, de uno Api en lugar de de XProfan incluso aufgerufen se, XProfan esto no es korrekt auseinanderhalten kann y Variablenspeicher überschrieben voluntad?
[/quote:a00f5c25f8][/quote:a00f5c25f8] Erst una vez no Variables, pero de Profano intern genutzte Estructuras Außerdem es no a Übergabe uno Prozeduradresse, pero en el, qué en el Hauptprogramm passiert.
¿Por qué haut el hin, qué du como tust: Usted stoppst el Temporizador, bevor el Ventana genera se => el kann no crashen, el el Temporizador se ejecuta nada, si el Ventana genera se. Nochmal (1001 veces ): Theorie: 1 Profano arbeitet´die Crear Función la ventana de. 2. Profano legt esta Daten de Crear en internen Speicher de, en u.a. a überprüfen, welche API aufgerufen weerden muß. 3. Antes el API Crear komplett abgearbeitet es, d.h. bevor el API CreateWindowEx de Profano aufgerufen se, ruft el OS el el Temporizador mitgegebene Adresse en. 4. Profano führt Características en el Callback de y belegt el internen Variables con neuen Werten. 5. Der Callback se a para Ende ausgeführt y lo se a el Adresse gesprungen, a el vorher aufgehört wurde. 6. Profano voluntad CreateWindowEx aufrufen, hier posición aber ahora el Daten vom Callback
So mi Yo el... |
|
|
| |
|
|
|
| Usted Yo weiß en Su Theorie, auch no sólo seid Deinem heutigen Posting pero me va el Ganze ya muy largo por el Kopf...
...por lo tanto meinte Yo sí el lo demzufolge no sólo TimerOPs betrifft pero jede Api welche una XProfanProzedur aufruft! |
|
|
| |
|
|
|
| Yo glaube lo son para Roland el Möglichkeit, una Aufruf uno XProfanprozedur de uno API heraus, abzuprüfen. Yo denke incluso lo wäre sonst el Función procaddr garnicht posible - irgendwie muss él sí el angeblichen Sprung a una no-nativ-vorliegenden Prozeduradresse umsetzen. Tal vez kann él hier algo kapseln?! |
|
|
| |
|
|