Foro | | | | - Página 1 - |
| | ¡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? |
| | | | |
| | | | | - Página 3 - |
| | Und esta drei Fuente wären como bajo anderem auch todavía interessant: KompilierenMarcaSeparaciónDEF @GetDlgCtrlID(1) !"USER32","GetDlgCtrlID"
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
DEF @GetProcAddress(2) !"KERNEL32","GetProcAddress"
Testprogramm Timer
Profan Version 9
$H Windows.ph
-Main----------------------------------------------------------------
Declare Timer_Busy%,Ende%
Declare TimerID&,Create%,T_Text&,Test#,T_TEXT2&
Declare OldWndProc&,DLL&,P_A&
LET DLL&=@Usedll("Send.DLL")
WindowStyle 26+512
WindowTitle "Subclassingtest"
Window 100,100 - 370,200
Let T_TEXT&=@CREATEButton(%HWND,"",30,80,300,30)
Let T_TEXT2&=@CREATEButton(%HWND,"Ende",30,120,300,30)
Waitinput
Set("FastMode", 1)
OldWndProc& = ~GetWindowLong(%hWnd,~GWL_WNDPROC)
LET P_A&=@GetProcAddress(DLL&,"_timer@16")
~SetWindowLong(%hWnd,~GWL_WNDPROC,@ProcAddr("Sub",4))
Ende%=0
TimerID&=~SetTimer(%HWND,333,20,P_A&)
Print TimerID&
WhileNot Ende%
WaitInput
If @Buttonclicked(T_TEXT&)
Einstellungen
Endif
If @Buttonclicked(T_TEXT2&)
~KillTimer(%HWND,333)
Ende%=1
Freedll DLL&
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)
hD% = @Control("Dialog","Einstellungen",$14C80084,%WinLeft+80,%WinTop+155,230,190,%HWND,0,%HINSTANCE,$101)
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
Proc Sub
Parameters hWnd&,Message&,wParam&,lParam&
If Message&=$401
Inc Timer_Busy%
Settext T_Text&,"Timer: " + @str$(Timer_Busy%) + " Durchläufe"
Return ~CallWindowProc(OldWndProc&,hWnd&,Message&,wParam&,lParam&)
Else
Return ~CallWindowProc(OldWndProc&,hWnd&,Message&,wParam&,lParam&)
EndIf
ENDPROC
KompilierenMarcaSeparaciónDEF @GetDlgCtrlID(1) !"USER32","GetDlgCtrlID"
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
DEF @GetProcAddress(2) !"KERNEL32","GetProcAddress"
Testprogramm Temporizador
Profano Versión 9
$H Windows.ph
-Main----------------------------------------------------------------
Declarar Timer_Busy%,Ende%
Declarar TimerID&,Crear%,T_Text&,Test#,T_TEXT2&
Declarar OldWndProc&,DLL&,P_A&
LET DLL&=@Usedll("Send.DLL")
Ventana de Estilo 26+512
Título de la ventana "Subclassingtest 2"
Ventana 100,100 - 370,200
Let T_TEXT&=@CREATEButton(%HWND,"",30,80,300,30)
Let T_TEXT2&=@CREATEButton(%HWND,"Ende",30,120,300,30)
Waitinput
Conjunto("FastMode", 1)
OldWndProc& = ~GetWindowLong(%hWnd,~GWL_WNDPROC)
LET P_A&=@GetProcAddress(DLL&,"_timer@16")
~SetWindowLong(%hWnd,~GWL_WNDPROC,@ProcAddr("Sub",4))
Ende%=0
TimerID&=~SetTimer(%HWND,333,25,@ProcAddr("Sub",4))
Imprimir TimerID&
Sinestar encargado Ende%
WaitInput
If @Buttonclicked(T_TEXT&)
Einstellungen
Endif
If @Buttonclicked(T_TEXT2&)
~KillTimer(%HWND,333)
Ende%=1
Freedll DLL&
Endif
Wend
End
-Proc Einstellungen
Proc Einstellungen
Declarar hD%, hA%, hB%, OK%, hTime%
Declarar hF1%, hT1%
Claro OK%
Dialogfenster erzeugen
hD% = @Crear("Dialog",%hWnd,"Einstellungen",%WinLeft+80,%WinTop+155,230,190)
hD% = @Control("Dialog","Einstellungen",$14C80084,%WinLeft+80,%WinTop+155,230,190,%HWND,0,%HINSTANCE,$101)
hF1% = @Crear("Font",Arial,16,0,0,0,0)
hT1% = @Crear("Text",hD%,"Einstellungen...",10,10,220,20)
SetFont hT1%,hF1%
hTime% = @Crear("TimeEdit", hD%, "00:00:00", 10, 35, 70, 24)
hB% = @Crear("Button",hD%,"&Nachstellen",10,120,100,28)
hA% = @Crear("Button",hD%,"&Abbrechen",120,120,100,28)
Sinestar encargado Ok%
WaitInput
If @ButtonClicked(hB%) Nachstellen
Ok% = 1
Aktionen hier
ElseIf @ButtonClicked(hA%) Alto
Ok% = 1
ElseIf (%Key = 2) ALT+F4 o schließen
Ok% = 1
EndIf
EndWhile
DeleteObject hF1%
@DestroyWindow(hD%)
ENDPROC
Proc Sub
Parámetros hWnd&,Message&,wParam&,lParam&
Inc Timer_Busy%
Settext T_Text&,"Timer: " + @str$(Timer_Busy%) + " Durchläufe"
ENDPROC
KompilierenMarcaSeparación Der Fehler ha also wohl nichts con Subclassing a tun - oder qué media du genau? |
| | | | |
| | | | - Página 4 - |
| | | [quote:19dfeaab2b=Frank Abbing][quote:19dfeaab2b]Como ya he dicho: Bitte Testen! Interessiert mich brennend. Bau veces el Callback en un DLL - dauert sí no largo...[/quote:19dfeaab2b] Tuve el ya gemacht. Mi Dll ha un hilo producido y dieser ha una profansche Callbackroutine aufgerufen. Nach más Aufrufen brach Profano con el sonderlichsten Fehlermeldungen de. Je kürzer el Spanne el Aufrufe, desto más rápido kamen el Fehler.[/quote:19dfeaab2b] ¡Hola Franco...
Endlich versteht veces uno, Yo sage . Hab deinen Contribución desafortunadamente sólo ahora gelesen. Dieses Problema me está ebenfalls bekannt - el liegt aber bastante woanders y läßt se bastante simplemente umgehen (siehe Rolf). |
| | | | |
| | | So Andreas,
wer no hören kann muß fühlen.
Im Grunde ir unsere Meinungen sí dahingehend auseinander el Yo sage, el lo grundsätzlich a procaddr liegt, porque dies el Schnittstelle es dazu el de aussen Prozeduraufrufe injiziert voluntad puede y ¿Quieres decir que el lo específicamente con WM_Timer a tun ha.
Also Yo todos sin Wm_timer gelöst, una Call se de uno DLL direkt aufgerufen, siempre y siempre otra vez.
Lo belegt el lo vokommen kann, el si una proc el por procaddr verfügbar gemacht wurde, extern aufgerufen se, XProfan se verhäddert. Ohne ProcAddr wäre dies sí no posible.
Hier el Code para Selbertesten, unten ne versaute Dll.
Lo ha demzufolge nichts con el Hilo-Unit a tun y nichts con wm_timer, por qué Yo, el Hilo auch de el Hilo-Unit-Zona lejos, y después de Programación geschoben habe. KompilierenMarcaSeparaciónDef @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
declare h&
h&:=usedll("thread2.dll")
h&:=external("kernel32","GetProcAddress",h&,"dodo")
external("thread2.dll","f",procaddr("thread.do",0),h&)
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
|
| | | | |
| | | ¡Hola IF...
Im Yo el Eindruck, wir reden en el Principio de el selben Sache , denken aber beide no zuende . Hast du dir ya veces überlegt, por qué el Fehler beim Verwenden de Conjunto(FastMode, 1) no mehr auftritt ? Si el wirklich cada Callback en una Profanfunktion vorkommt (el glaube Yo dir, auch sin el Ver código fuente el DLL a sehen), müßte uno necesariamente genau wissen, en welchen Profanfunktionen como Gefahr besteht. Yo habe hier Stundenlang con Writeini y Readini$ herumexperimentiert, sin (para Glück) una Fehler a erzeugen. Si el wirklich incluso (laut Roland) beim direkten Aufrufen de APIs passieren podría, hay eigentlich gar no Möglichkeit, el Messagehandling beizubehalten y de otra manera gleichzeitig ablaufen que se.
Das lo a el Häufigkeit des Aufrufens el Procedimiento liegt, kann Yo no bestätigen. Je weniger el Procedimiento aufgerufen se, umso geringer Es el Wahrscheinlichkeit, el una Fehler passiert - el Fehler passieren aber doch. In TNT se ebenfalls una Callback verwendet - el Programa verwende Yo laufend, en irgendetwas en Windows a untersuche. Am Anfang traten, egal como oft el Callback aufgerufen wurde, siempre irgendwelche Fehler en. Seit Yo hay algunos Profanfunktionen a una otro Punto se han trasladado (wo ellos no Problemas mehr hacer), es Ruhe. |
| | | | |
| | | [quote:3974012546]Hast du dir ya veces überlegt, por qué el Fehler beim Verwenden de Conjunto(FastMode, 1) no mehr auftritt ? [/quote:3974012546] Es Unsinn Andreas, lo ha auch nichts con el Fastmode a tun.
Lo liegt simplemente a el Umsetzung de procaddr - Yo me mi Betrachtungsweise bestätigen dejar.
Im FastMode treten natürlich selbige Problemas en! |
| | | | |
| | | Apéndice: Gefahr besteht grundsätzlich en allen ProfanFunktionen, el Gefahr aumenta se - Yo sag veces plump - de desto mehr Aufrufen el Función intern besteht.
Diese Dinge de denen Usted berichtest - sagen wir lo son Neben/Folgeerscheinungen. |
| | | | |
| | | ¡Hola IF...
Erst veces besten Dank para deine Bemühungen. Si el así stimmen (y el heißt ahora no, el Yo dir el no glaube), es el echt una Hiobsbotschaft - en el Klartext bedeutet el sí u.a. folgendes: - Es en keiner Weise posible sólo Profano irgendetwas (gleichzeitig) fehlerfrei ablaufen que se. - Es no posible, con Profano una vernünftigen Service a escribir. - Un vielzahl a APIs puede ser con Profano no uso (SendMessageCallback, todos Temporizador con Callbacks, EnumThreadWindows, EnumWindows....)
Eignet se Profano überhaupt entonces para Programmieren? Tiempo angenommen, muß en cierto Zeitabständen algo encima una Callback dokumentieren y mein Programa fummelt gleichzeitig con RegLoadKey / RegUnloadKey en el Registry rum (como RegEdt32 el tut), wer kommt entonces para el Schaden a fremden Rechnern oder Systemen en? Sollte uno con Profano programmierte Programas entonces überhaupt en Umlauf bringen? Das muß se schnellstens ändern! |
| | | | |
| | | Naja! El Excepción - en el lo keinerlei Problemas son - son sólo Características welche una ProcAddr benötigen aber se sólo final si la Arbeit geschehen es! Roland ha ProcAddr eigendlich auch sólo así pensamiento!
Hier z.B. dieses Ejemplo: [...]
Also Probs gibts no, si la Función el Proc hinter el ProcAddr aufruft, dies auch sólo tut solange ellos incluso todavía se ejecuta.
Was el Gleichzeitigkeit así betrifft bedeutet dies para todos otro Fälle el el Función ProcAddr ungeeignet es. Leider! |
| | | | |
| | | [quote:0f571140cc=iF]Naja! El Excepción - en el lo keinerlei Problemas son - son sólo Características welche una ProcAddr benötigen aber se sólo final si la Arbeit geschehen es! Roland ha ProcAddr eigendlich auch sólo así pensamiento! [/quote:0f571140cc] Also todos Enum-Características hacer no Problemas. [quote:0f571140cc=iF] Also Probs gibts no, si la Función el Proc hinter el ProcAddr aufruft, dies auch sólo tut solange ellos incluso todavía se ejecuta. [/quote:0f571140cc] Also gibts u.a. con SendMessageCallback Problemas. Das Carta sämtlicher Services sería ebenfalls darunter fallen y Problemas hacer. Un vernünftigen Taskmanager puede ser entonces ebenfalls no escribir. [quote:0f571140cc=iF] Was el Gleichzeitigkeit así betrifft bedeutet dies para todos otro Fälle el el Función ProcAddr ungeeignet es. Leider![/quote:0f571140cc] Es muy schlimm. Überhaupt una Taskmanager a escribir, es also no posible. Den Speicherverbrauch mehrere Prozesse en el Auge a behalten, ebenfalls no. Vernünftige Registryeditoren fallen wohl auch flach - während uno Unterschlüssel auflistet, podría uno ser Programa sólo schwer bedienbar halten. Un Uhrzeit en mi Programa einzublenden - va no. Wenn se el wirklich no con Conjunto(FastMode, 1) umgehen läßt, schmeiße Yo Profano más bien sólo veces en el Ecke. Diese Problema muß necesariamente mejor dokumentiert oder al besten bastante beseitigt voluntad - como puede ser sí en Teufelsküche kommen. |
| | | | |
| | | Naja uno munkelt lo podría bald Abhilfe geben. ;)
Como restos wohl nichts más como el Erkenntnis - y algo warten...
Zumal - todos se eigendlich por Usted aufgebauscht - el muss Yo auch veces klar sagen!
Es tatsächlich nichtmal halb así wild!
Yo escribir muy viele Programas welche ProcAddrs nutzen - Yo hatte todavía kein solches Phänomen - muss aber auch dazu sagen - Yo bin natürlich geübt en él me muy bien vorzustellen como una Source el Yo escribir genau Abläuft - y verhindere así natürlich ya unbewusst así manch Komplikationen - especialmente me ProcAddrProblem como ya oft erwähnt no neu es.
Einfache verfügbare Beispiele - ya una derartigen Fehler en Konstantinopel oder Okrea herbeiführen puede? Yo glaube nein.
Das Carta de ganzen Hives oder grobe RegÄnderungen sería Yo - egal en welcher Lingua - eh no así simplemente draufzu abarbeiten dejar. Algo como sería Yo siempre en una Pool tun welcher abgearbeitet se si la Luft rein es. Machs Usted also no a ligeramente!
Usted sprichst sólo muy spezielle Sonderfälle a - como mag lo natürlich ser el el ProcAddr no safe es. Für esta Sonderfälle hast Usted aber como Programmierer genügend Ausweichmethoden a Hand.
Alles va nunmal en keiner Lingua - wohlbemerkt - una safe ProcAddr kann Yo vorstellen se lo en XProfan geben! |
| | | | |
| | Sebastian König | ¡Hola Andreas,
[quote:afe202e11c](...) Es muy schlimm. Überhaupt una Taskmanager a escribir, es also no posible. Den Speicherverbrauch mehrere Prozesse en el Auge a behalten, ebenfalls no. Vernünftige Registryeditoren fallen wohl auch flach - während uno Unterschlüssel auflistet, podría uno ser Programa sólo schwer bedienbar halten. Un Uhrzeit en mi Programa einzublenden - va no. Wenn se el wirklich no con Conjunto(FastMode, 1) umgehen läßt, schmeiße Yo Profano más bien sólo veces en el Ecke.[/quote:afe202e11c] Als Workaround kannst Usted sí primero el aktuelle Profano2Cpp-Beta nehmen . Damit tritt el Problematik schließlich no en, como wir [...] ya diskutiert haben...
MfG
Sebastian |
| | | | |
| | | Posesiones sowieso antes, me Profano2Cpp zuzulegen. |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 4 subscriber: |