Prozeduren paralell ablaufen lassen - ohne threads
Der Parameter ist nicht empfohlen, sondern zwingend notwendig.
Der fehlende Parameter kann (wird) irgend wann zu einem
unauffindbaren Softwarefehler (Absturz) führen.
MFG PMV
Der fehlende Parameter kann (wird) irgend wann zu einem
unauffindbaren Softwarefehler (Absturz) führen.
MFG PMV
Zuletzt geändert von PMV am 02.12.2008 20:42, insgesamt 2-mal geändert.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Es ist so, wie es Stargate gesagt hat.
(Ist jetzt mal so dahin gecodet)
Code: Alles auswählen
Global global1.i, global2.i
Procedure Thread1(dummy.i)
Repeat
global1 + 1
Until global1 = 10
EndProcedure
Procedure Thread2(dummy.i)
Repeat
global2 + 1
Until global2 = 15
EndProcedure
thread1.i = CreateThread(@Thread1(), 0)
thread2.i = CreateThread(@Thread2(), 0)
WaitThread(thread1)
WaitThread(thread2)
MessageRequester("out", "Should be 10: " + Str(global1) + " Should be 15: " + Str(global2))
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Irgendwie funktioniert das nicht...
Mir ist es nicht gelungen den Fehler in einem "einfachen" Code zu reproduzieren. Also hier mal mein Programm:
Es ist ein Maus + Tastatur Recorder einzelne Recorder Arten funktionieren aber sobald 2 oder 3 Arten ausgewählt sind wird das Programm sofort beendet.
(Escape zum stoppen)
MfG Tompazi
EDIT: das wo ich glaub das der Fehler ist ist dort wo ich kommentiert habe.
Mir ist es nicht gelungen den Fehler in einem "einfachen" Code zu reproduzieren. Also hier mal mein Programm:
Es ist ein Maus + Tastatur Recorder einzelne Recorder Arten funktionieren aber sobald 2 oder 3 Arten ausgewählt sind wird das Programm sofort beendet.
(Escape zum stoppen)
Code: Alles auswählen
; MouseRecorder
;
Global Result1$, Result2$, Result3$
Procedure.s recMouseMovement(Event)
GetAsyncKeyState_(1)
X = DesktopMouseX()
Y = DesktopMouseY()
Timer = ElapsedMilliseconds()
Repeat
StartTime = ElapsedMilliseconds()
Delay(1)
XNew = DesktopMouseX()
YNew = DesktopMouseY()
If XNew <> X Or YNew <> Y
NewTime = ElapsedMilliseconds() - StartTime +1
Result$ = Result$ + Str(XNew) + "|" + Str(YNew) + "|" + Str(NewTime) + "|"
EndIf
X = DesktopMouseX()
Y = DesktopMouseY()
Until GetAsyncKeyState_(Event)
Result1$ = Result$
ProcedureReturn Result$
EndProcedure
Procedure replayMouseMovement(dummy)
Record$ = Result1$
i = 1
Repeat
XNew = Val(StringField(Record$,i,"|"))
YNew = Val(StringField(Record$,i+1,"|"))
NewTime = Val(StringField(Record$,i+2,"|"))
SetCursorPos_(XNew,YNew)
Delay(NewTime)
i + 3
Until StringField(Record$,i,"|") = ""
EndProcedure
Procedure.s recWrite(Event)
GetAsyncKeyState_(1)
BetweenEventStartTime = ElapsedMilliseconds()
Repeat
For a = 1 To 254
If a <> 1 And a <> 2 And a <> 4 And a <> 160 And a <> 161 And a <> 162 And a <> 163 And a <> 164 And a <> 165
If GetAsyncKeyState_(a)
While GetAsyncKeyState_(a)
For b = 1 To 254
If a = $5B Or a = $5C Or a = $10 Or a = $11 Or a = $12
If b <> 1 And b <> 2 And b <> 4 And b <> 160 And b <> 161 And b <> 162 And b <> 163 And b <> 164 And b <> 165 And a <> b
If GetAsyncKeyState_(b)
vk2.s = Hex(b)
If Len(vk2) = 1
vk2 = "0" + vk2
EndIf
Continue
EndIf
EndIf
EndIf
Next b
Wend
BetweenEventStopTime = ElapsedMilliseconds() - BetweenEventStartTime
vk1.s = Hex(a)
If Len(vk1) = 1
vk1 = "0" + vk1
EndIf
If vk2
Result$ = Result$ + Str(BetweenEventStopTime) + "|" + vk1 + "|" + vk2 + "|"
BetweenEventStartTime = ElapsedMilliseconds()
Else
Result$ = Result$ + Str(BetweenEventStopTime) + "|" + vk1 + "|" + "-1" + "|"
BetweenEventStartTime = ElapsedMilliseconds()
EndIf
EndIf
vk1 = ""
vk2 = ""
EndIf
Next a
Until GetAsyncKeyState_(Event)
Result3$ = Result$
ProcedureReturn Result$
EndProcedure
Procedure replayWrite(dummy)
Record$ = Result3$
i = 1
Repeat
NewTime = Val(StringField(Record$,i,"|"))
Key1$ = StringField(Record$,i+1,"|")
Key2$ = StringField(Record$,i+2,"|")
If Len(Key1$) > 1
vk1 = Val("$" + Key1$)
Else
vk1 = VkKeyScan_(Asc(Key1$))
EndIf
If Len(Key2$) > 1 And Key2$ <> "-1"
vk2 = Val("$" + Key2$)
ElseIf Key2$ = "-1"
OneKey = 1
Else
vk2 = VkKeyScan_(Asc(Key2$))
EndIf
If OneKey = 0
keybd_event_(vk1, 0, 0, 0)
keybd_event_(vk2, 0, 0, 0)
keybd_event_(vk2, 0, #KEYEVENTF_KEYUP, 0)
keybd_event_(vk1, 0, #KEYEVENTF_KEYUP, 0)
Else
keybd_event_(vk1, 0, 0, 0)
keybd_event_(vk1, 0, #KEYEVENTF_KEYUP, 0)
EndIf
Delay(NewTime)
i + 3
Until StringField(Record$,i,"|") = ""
EndProcedure
Procedure.s recClicks(Event)
GetAsyncKeyState_(1)
BetweenEventStartTime = ElapsedMilliseconds()
Repeat
If GetAsyncKeyState_(#VK_LBUTTON)
BetweenEventStopTime = ElapsedMilliseconds() - BetweenEventStartTime
X = DesktopMouseX()
Y = DesktopMouseY()
ClickTime1 = ElapsedMilliseconds()
While GetAsyncKeyState_(#VK_LBUTTON) : Wend
ClickTime = ElapsedMilliseconds() - ClickTime1
Result$ = Result$ + Str(BetweenEventStopTime) + "|0" + "|" + Str(ClickTime) + "|" + Str(X) + "|" + Str(Y) + "|"
BetweenEventStartTime = ElapsedMilliseconds()
EndIf
If GetAsyncKeyState_(#VK_RBUTTON)
BetweenEventStopTime = ElapsedMilliseconds() - BetweenEventStartTime
X = DesktopMouseX()
Y = DesktopMouseY()
ClickTime1 = ElapsedMilliseconds()
While GetAsyncKeyState_(#VK_RBUTTON) : Wend
ClickTime = ElapsedMilliseconds() - ClickTime1
Result$ = Result$ + Str(BetweenEventStopTime) + "|1" + "|" + Str(ClickTime) + "|" + Str(X) + "|" + Str(Y) + "|"
BetweenEventStartTime = ElapsedMilliseconds()
EndIf
If GetAsyncKeyState_(#VK_MBUTTON)
BetweenEventStopTime = ElapsedMilliseconds() - BetweenEventStartTime
X = DesktopMouseX()
Y = DesktopMouseY()
ClickTime1 = ElapsedMilliseconds()
While GetAsyncKeyState_(#VK_MBUTTON) : Wend
ClickTime = ElapsedMilliseconds() - ClickTime1
Result$ = Result$ + Str(BetweenEventStopTime) + "|2" + "|" + Str(ClickTime) + "|" + Str(X) + "|" + Str(Y) + "|"
BetweenEventStartTime = ElapsedMilliseconds()
EndIf
Until GetAsyncKeyState_(Event)
Result2$ = Result$
ProcedureReturn Result$
EndProcedure
Procedure replayClicks(dummy)
Record$ = Result2$
i = 1
Repeat
NewTime = Val(StringField(Record$,i,"|"))
NewMouseButton = Val(StringField(Record$,i+1,"|"))
NewMouseTime = Val(StringField(Record$,i+2,"|"))
XNew = Val(StringField(Record$,i+3,"|"))
YNew = Val(StringField(Record$,i+4,"|"))
SetCursorPos_(XNew,YNew)
Select NewMouseButton
Case 0
mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0)
Delay(NewMouseTime)
mouse_event_(#MOUSEEVENTF_LEFTUP,0,0,0,0)
Case 1
mouse_event_(#MOUSEEVENTF_RIGHTDOWN,0,0,0,0)
Delay(NewMouseTime)
mouse_event_(#MOUSEEVENTF_RIGHTUP,0,0,0,0)
Case 2
mouse_event_(#MOUSEEVENTF_MIDDLEDOWN,0,0,0,0)
Delay(NewMouseTime)
mouse_event_(#MOUSEEVENTF_MIDDLEUP,0,0,0,0)
EndSelect
Delay(NewTime)
i + 5
Until StringField(Record$,i,"|") = ""
EndProcedure
;- Window Constants
;
Enumeration
#Window_0
#Toolbar
EndEnumeration
;- Gadget Constants
;
Enumeration
#Record
#Replay
#MouseMovement
#Keyboard
#MouseClicks
#Text_0
#Save
#Open
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 348, 471, 335, 240, "Mouse Recorder", #PB_Window_SystemMenu| #PB_Window_TitleBar | #PB_Window_ScreenCentered )
If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(#Record, 30, 200, 80, 30, "Record")
ButtonGadget(#Replay, 230, 200, 80, 30, "Replay")
CheckBoxGadget(#MouseMovement, 40, 120, 140, 20, "record mouse movement")
CheckBoxGadget(#Keyboard, 40, 150, 110, 20, "record keystrokes")
CheckBoxGadget(#MouseClicks, 40, 90, 100, 20, "record clicks")
EndIf
If CreateToolBar(#Toolbar, WindowID(#Window_0))
ToolBarStandardButton(#Open, #PB_ToolBarIcon_Open)
ToolBarStandardButton(#Save, #PB_ToolBarIcon_Save)
EndIf
SetGadgetState(#MouseMovement,1)
SetGadgetState(#Keyboard,1)
SetGadgetState(#MouseClicks,1)
EndIf
EndProcedure
Open_Window_0()
Repeat
WindowEvent = WaitWindowEvent()
Select WindowEvent
Case #PB_Event_Gadget
Select EventGadget()
Case #Record ; Record Button
If GetGadgetState(#MouseMovement) And Not GetGadgetState(#MouseClicks) And Not GetGadgetState(#Keyboard)
Record$ = "010|"
HideWindow(#Window_0,1)
Record$ = Record$ + recMouseMovement(#VK_ESCAPE)
HideWindow(#Window_0,0)
ElseIf GetGadgetState(#MouseClicks) And Not GetGadgetState(#MouseMovement) And Not GetGadgetState(#Keyboard)
Record$ = "100|"
HideWindow(#Window_0,1)
Record$ = Record$ + recClicks(#VK_ESCAPE)
HideWindow(#Window_0,0)
ElseIf GetGadgetState(#Keyboard) And Not GetGadgetState(#MouseMovement) And Not GetGadgetState(#MouseClicks)
Record$ = "001|"
HideWindow(#Window_0,1)
Record$ = Record$ + recWrite(#VK_ESCAPE)
HideWindow(#Window_0,0)
ElseIf GetGadgetState(#MouseMovement) And GetGadgetState(#MouseClicks) And Not GetGadgetState(#Keyboard) ; Ab hier mehrere Arten
Record$ = "110|"
HideWindow(#Window_0,1)
CreateThread(@recClicks(),#VK_ESCAPE)
Record$ = Record$ + recMouseMovement(#VK_ESCAPE)
HideWindow(#Window_0,0)
ElseIf GetGadgetState(#MouseClicks) And Not GetGadgetState(#MouseMovement) And GetGadgetState(#Keyboard)
Record$ = "101|"
HideWindow(#Window_0,1)
CreateThread(@recWrite(),#VK_ESCAPE)
Record$ = Record$ + recClicks(#VK_ESCAPE)
HideWindow(#Window_0,0)
ElseIf GetGadgetState(#Keyboard) And Not GetGadgetState(#MouseMovement) And GetGadgetState(#MouseClicks)
Record$ = "011|"
HideWindow(#Window_0,1)
CreateThread(@recClicks(),#VK_ESCAPE)
Record$ = Record$ + recWrite(#VK_ESCAPE)
HideWindow(#Window_0,0)
ElseIf GetGadgetState(#MouseMovement) And GetGadgetState(#MouseClicks) And GetGadgetState(#Keyboard)
Record$ = "111|"
HideWindow(#Window_0,1)
CreateThread(@recClicks(),#VK_ESCAPE)
CreateThread(@recWrite(),#VK_ESCAPE)
Record$ = Record$ + recMouseMovement(#VK_ESCAPE)
HideWindow(#Window_0,0)
EndIf
Case #Replay ; Replay Button
If Record$
Mode.s = Mid(Record$,0,3)
Select Mode
Case "010"
HideWindow(#Window_0,1)
replayMouseMovement(1)
HideWindow(#Window_0,0)
Case "100"
HideWindow(#Window_0,1)
replayClicks(1)
HideWindow(#Window_0,0)
Case "001"
HideWindow(#Window_0,1)
replayWrite(1)
HideWindow(#Window_0,0)
Case "110" ; Ab hier mehrere Arten
HideWindow(#Window_0,1)
CreateThread(@replayClicks(),0)
replayMouseMovement(1)
HideWindow(#Window_0,0)
Case "101"
HideWindow(#Window_0,1)
CreateThread(@replayWrite(),0)
replayClicks(1)
HideWindow(#Window_0,0)
Case "011"
HideWindow(#Window_0,1)
CreateThread(@replayMouseMovement(),0)
replayWrite(1)
HideWindow(#Window_0,0)
Case "111"
HideWindow(#Window_0,1)
CreateThread(@replayClicks(),0)
CreateThread(@replayMouseMovement(),0)
replayWrite(1)
HideWindow(#Window_0,0)
EndSelect
EndIf
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #Open
OpenFileRequester("Choose a saved session...","","",0)
Case #Save
SaveFileRequester("Save your current session...","","",0)
EndSelect
EndSelect
Until WindowEvent = #PB_Event_CloseWindow
End
EDIT: das wo ich glaub das der Fehler ist ist dort wo ich kommentiert habe.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken