Español
Foro

Gefahr schlimmer Crashes ca. ProcAddr en Callbacks, Hilos

 
- 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?
 
09.09.2006  
 



 
- Página 3 -


Falsch verstanden, mi Yo. Roland ha ya längst geantwortet - en seinem Foro .
Probiers doch de - schreib el Callback en un DLL y spreche ihn de Profano encima SetTimer a - el dauert doch sólo wenige Minuten y yo kanns no.
 
09.09.2006  
 



Yo saber ahora desafortunadamente Rolands Contribución dazu no - schreib el Callback en un DLL y spreche ihn de Profano encima SetTimer a kann Yo no umsetzen, el Aufgabenstellung verstehe Yo no.

Wenn lo hilft el Problematik algo entgegenzuwirken entonces sólo fuera así...
 
09.09.2006  
 



Como ya he dicho - schreib irgendeine Función en un DLL y ruf el Callback en un Profanprogramm con SetTimer en - also de diesem Ver código fuente
KompilierenMarcaSeparación
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)
TimerID& = ~SetTimer(%HWND,333,25,@ProcAddr("Timer",4))

WhileNot Ende%

    WaitInput

    If @MenuItem(108)

        Einstellungen

    Endif

    If @MenuItem(109)

        ~KillTimer(%HWND,333)
        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 Timer

    Parameters P1&,P2&,P3&,P4&
    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"
    se Test#

ENDPROC


sol el
KompilierenMarcaSeparación
Proc Temporizador

    Parámetros P1&,P2&,P3&,P4&
    Dim Test#,1000000
    Inc Timer_Busy%
    Localizar 5,5
    Imprimir "Timer:" + @str$(Timer_Busy%) + " Durchläufe"
    Settext T_Text&,"Timer:" + @str$(Timer_Busy%) + " Durchläufe"
    Disponer Test#

ENDPROC


In una Función uno DLL untergeracht voluntad.

Hier es [...]  a el Problema, y aquí es [...] .
 
09.09.2006  
 



Aha Yo el para mich entscheidene Aussage de Roland veces extrahiert:

[quote:a314d200ca] El CallBacks en XPofan Yo en efecto más para el Fälle instalado, wo una API-Función una CallBack-Prozdur benötigt y sólo zurückkehrt, después de esta ausgeführt wurde. [/quote:a314d200ca]
Diese Aussage begründet el Yo bastante y garnicht daneben liege si yo sage el el Grundproblematik en procaddr  liegt si una Proc de aussen aufgerufen se. Den Roland incluso meint con obiger Aussage en efecto, el lo mejor es si el XProfanprogramm wartet.

Demzufolge es egal si el XProfanProc de el Api SetTimer, oder por Call de uno otro DLL ausgelöst se. Si el XProfanprogramm no grade en el Modus des wartens en una Funktionsende es - entonces gibts mächtig trouble.

Das wiederum ists worüber Yo seid procaddr grüble - qué aber auch bedeutet - el Roland tal vez el Aufzurufenden Características hinter el Procaddr-Adresse kapseln debería - como una Wartehalle - welche entonces por Roland abgebaut se si XProfan meint el lo nichts a tun ha.
 
09.09.2006  
 



Como ya he dicho: Bitte Testen! Interessiert mich brennend. Bau veces el Callback en un DLL - dauert sí no largo...
 
09.09.2006  
 



Jaja kein Problema - pero yo verstehe el Tarea siempre todavía no!

El Callback en un DLL bauen

Schreib doch simplemente nen XProfan10 Zeiler para el XProfanprogramm, y una más para el Yo en el DLL erledigen se! Yo glaub esta Syntax liegt me mehr... ;D
 
09.09.2006  
 



...porque auch hier scheinst du el Hälfte überlesen a haben:
[quote:ce4ddc094d]
Su Analyse trifft el problema bastante genau: En Crear Es el Chance, daß el Temporizador a Unzeit (also während el Abarbeitung des Befehles) ausgelöst se, deutlich höher como en una Control y hay algo höher, como en una direkten API-Aufruf, aber auch como kann no 100%ig ausgeschlossen voluntad.
[/quote:ce4ddc094d]
Es genau el Yo mi.
Und esta
[quote:ce4ddc094d]
El CallBacks en XPofan Yo en efecto más para el Fälle instalado, wo una API-Función una CallBack-Prozdur benötigt y sólo zurückkehrt, después de esta ausgeführt wurde.
[/quote:ce4ddc094d]
widerspricht deiner Aussage, el todos Callbacks problematisch son. Como ya he dicho, test!

Nochmals a deinem Ver código fuente:
Ist una guter Workaround, doch podría una continuación no es igual una Bucle con un Wartebefehl el después de uno Eingabe abbricht einbauen? Zeitgerecht se como doch gar nichts mehr ausgeführt, oder?
 
09.09.2006  
 



Ne Andreas, Yo habs no überlesen - aber wir reden en verschiedenen Leveln - Yo meins no böse. Yo durchschaue el Angelegenheit - por lo tanto es ya largo no mehr.

Yo merke aber el Usted mich no tan completamente verstehst - por lo tanto Su Meinung el se mein Posting con el Zitat widerspricht - qué lo aber en mi Gedankenraum incluso untermalt.

Grunsatzdiskussion beiseite - laß uns morgen a el DLL feilen - mein Frauchen ruft...

Gute Nacht!
 
09.09.2006  
 



OK! Gute Nacht!
 
09.09.2006  
 




Frank
Abbing
[quote:5cd369ff12]Como ya he dicho: Bitte Testen! Interessiert mich brennend. Bau veces el Callback en un DLL - dauert sí no largo...[/quote:5cd369ff12]
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.
 
10.09.2006  
 



¡Hola IF...

Yo denke veces, wir sehen el Problematik wirklich a verschiedenen Stellen.
Hier el Beweis, el el nichts con ProcAddr a tun ha:
KompilierenMarcaSeparación
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)
TimerID& = ~SetTimer(%HWND,333,25,@ProcAddr("Timer",4))

WhileNot Ende%

    WaitInput

    If @MenuItem(108)

        Einstellungen

    Endif

    If @MenuItem(109)

        ~KillTimer(%HWND,333)
        Ende% = 1

    Endif

Wend

End
-Proc Einstellungen

Proc Einstellungen

    Declare hD%, hA%, hB%, OK%, hTime%
    Declare hF1%, hT1%
    Clear OK%
    Dialogfenster erzeugen
    Set("FastMode",1)
    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)
    Set("FastMode",0)

    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 Timer

    Parameters P1&,P2&,P3&,P4&
    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


Como du siehst, el va - also hay auch con Subclassing en el Principio no Problemas, egal woran lo mentira debería. Yo habe hier simplemente sólo el Message Handling abgeschaltet - qué wohl auch una Ursache el Problematik es.

Hier algo para Temporizador:
KompilierenMarcaSeparación
 $H Windows.ph
 $H Messages.ph
Declarar Ende%, OldWndProc&, hButton%
Declarar P_A$,P_A&,TIMERID&

Proc Timer_Sub

    Parámetros hWnd&,Message&,wParam&,lParam&

    If Message& = ~WM_TIMER

        Localizar 0,0
        Imprimir "Timermessage en WndProc empfangen: "+@STR$(wParam&)

    Más

        Volver ~CallWindowProc(OldWndProc&,hWnd&,Message&,wParam&,lParam&)

    EndIf

ENDPROC

Conjunto("FastMode", 1)
Ventana 0,0 -640,440
LET P_A$=@INPUT$("Adresse el TimerProc:","Funktionsadresse",@STR$(@ProcAddr("TimerProc",4)))

IF P_a$=""

    FIN

más

    LET P_A&=@VAL(P_A$)

endif

OldWndProc& = ~GetWindowLong(%hWnd,~GWL_WNDPROC)
~SetWindowLong(%hWnd,~GWL_WNDPROC,@ProcAddr("Timer_Sub",4))
LET hButton%=@Crear("Button",%hWnd,"Ende",10,100,100,24)
TimerID& = ~SetTimer(%HWND,333,20000,P_A&)
Claro Ende%

Sinestar encargado Ende%

    WaitInput

    If %Key = 2

        Ende% = 1

    ElseIf @Clicked(hButton%)

        Ende% = 1

    EndIf

EndWhile

~KillTimer(%HWND,333)
~SetWindowLong(%hWnd,~GWL_WNDPROC,OldWndProc&)
End

Proc TimerProc

    Parámetros 1&,2&,3&,4&
    Localizar 2,0
    Imprimir "TimerProc encima Adresse aufgerufen: "+@STR$(3&)

ENDPROC


Como uno sieht, erreicht el Temporizador el WndProc nada. Gib veces en el Editar 0 una, en lugar de el Adresse - entonces siehts anders de.

Hier una vez más con externer DLL (como Yo el meinte):
El DLL
KompilierenMarcaSeparación
 $DLL
-Procedimiento el en cierto Zeitintervallen ausgefuehrt se (4x pro Sekunde)
Declarar Timer_Busy%

dllproc Temporizador,4

    Parámetros P1&,P2&,P3&,P4&
    Dim Test#,1000000
    Inc Timer_Busy%
    Settext P3&,"Timer:" + @str$(Timer_Busy%) + " Durchläufe"
    Disponer Test#

ENDPROC


y aquí el Hauptprogramm
KompilierenMarcaSeparación
DEF @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 Ende%,DLL&,P_A&
Declarar TimerID&,Crear%,T_Text&,Test#
LET DLL&=@Usedll("Thread.DLL")
Ventana de Estilo 26+512
Título de la ventana "Timertest PHU-60"
Ventana 100,100 - 370,200
cls
Usermessages $10
LET P_A&=@GetProcAddress(DLL&,"_timer@16")
Imprimir P_A&,DLL&
Let T_TEXT&=@CREATETEXT(%HWND,"",30,30,300,30)
-Menue---------------------------------------------------------------
PopUp "&Programm"
AppendMenu 108,"&Einstellungen"
AppendMenu 109,"&Ende"
Ende% = 0
Temporizador conjunto (4x pro Sekunde, 250ms)
TimerID& = ~SetTimer(%HWND,T_TEXT&,25,P_A&)

Sinestar encargado Ende%

    WaitInput

    IF %UMESSAGE=$10

        LET ENDE%=1

    endif

    If @MenuItem(108)

        Einstellungen

    Endif

    If @MenuItem(109)

        ~KillTimer(%HWND,T_TEXT&)
        Ende% = 1

    Endif

Wend

~KillTimer(%HWND,T_TEXT&)
FreeDLL DLL&
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)
    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

-Procedimiento el en cierto Zeitintervallen ausgefuehrt se (4x pro Sekunde)

Proc Temporizador

    Parámetros P1&,P2&,P3&,P4&
    Dim Test#,1000000
    Inc Timer_Busy%
    Settext P3&,"Timer:" + @str$(Timer_Busy%) + " Durchläufe"
    Disponer Test#

ENDPROC


Funktioniert ebenfalls.
Und hier para Vergleich sin DLL:
KompilierenMarcaSeparación
DEF @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#
Ventana de Estilo 26+512
Título de la ventana "Timertest PHU-60"
Ventana 100,100 - 370,200
cls
Usermessages $10
Let T_TEXT&=@CREATETEXT(%HWND,"",30,30,300,30)
-Menue---------------------------------------------------------------
PopUp "&Programm"
AppendMenu 108,"&Einstellungen"
AppendMenu 109,"&Ende"
Ende% = 0
Temporizador conjunto (4x pro Sekunde, 250ms)
TimerID& = ~SetTimer(%HWND,T_TEXT&,25,@ProcAddr("Timer",4))

Sinestar encargado Ende%

    WaitInput

    IF %UMESSAGE=$10

        LET ENDE%=1

    endif

    If @MenuItem(108)

        Einstellungen

    Endif

    If @MenuItem(109)

        ~KillTimer(%HWND,T_TEXT&)
        Ende% = 1

    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)
    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

-Procedimiento el en cierto Zeitintervallen ausgefuehrt se (4x pro Sekunde)

Proc Temporizador

    Parámetros P1&,P2&,P3&,P4&
    Dim Test#,1000000
    Inc Timer_Busy%
    Settext P3&,"Timer:" + @str$(Timer_Busy%) + " Durchläufe"
    Disponer Test#

ENDPROC


qué otra vez el Fehler verursacht.
Meiner Meinung después de liegt dieses spezielle Problema wirklich a WM_TIMER - pero yo beim besten Willen kein Experte y lasse mich auch gern (al liebsten por beweisfähige Fuente) vom Gegenteil überzeugen.
 
10.09.2006  
 



Und esta drei Fuente wären como bajo anderem auch todavía interessant:
KompilierenMarcaSeparación
DEF @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ón
DEF @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
 $DLL
-Procedimiento el en cierto Zeitintervallen ausgefuehrt se (4x pro Sekunde)
Declarar Timer_Busy%,WND&

dllproc Temporizador,4

    Parámetros P1&,P2&,P3&,P4&
    @SendMessage(@FindWindow("Subclassingtest"),$401,0,0)

ENDPROC


Der Fehler ha also wohl nichts con Subclassing a tun - oder qué media du genau?
 
10.09.2006  
 




Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

5.141 Views

Untitledvor 0 min.
H.Brill26.01.2023
Peter Max Müller13.11.2017
iF19.07.2015
Ernst02.03.2015

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie