Prozeduren paralell ablaufen lassen - ohne threads

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Der Parameter ist nicht empfohlen, sondern zwingend notwendig.
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.
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
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

Beitrag von NicTheQuick »

Es ist so, wie es Stargate gesagt hat.

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))
(Ist jetzt mal so dahin gecodet)
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

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)

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
MfG Tompazi

EDIT: das wo ich glaub das der Fehler ist ist dort wo ich kommentiert habe.
Benutzeravatar
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

Beitrag von NicTheQuick »

Threadsafe aktiviert?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

NicTheQuick hat geschrieben:Threads haben doch sowieso keine Rückgabewerte. Dazu musst du sogar globale
Variablen benutzen.
Waere aber doof wenn dem wirklich so waere ;)

Rueckgabewerte kann man mit GetExitCodeThread_ erhalten.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

danke, Threadsafe wars :)

MfG Tompazi
Bild
Benutzeravatar
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

Beitrag von NicTheQuick »

edel hat geschrieben:
NicTheQuick hat geschrieben:Threads haben doch sowieso keine Rückgabewerte. Dazu musst du sogar globale
Variablen benutzen.
Waere aber doof wenn dem wirklich so waere ;)

Rueckgabewerte kann man mit GetExitCodeThread_ erhalten.
Cool, und wie geht das unter Linux und Mac? <)
Benutzeravatar
michel51
Beiträge: 84
Registriert: 01.11.2005 20:00
Wohnort: Dornhan-Weiden

Beitrag von michel51 »

NicTheQuick hat geschrieben: Cool, und wie geht das unter Linux und Mac? <)
Das ist eine gute Frage, vor allem für Mac :D
michel51

Mac OS X Snow Leopard (10.6.8 ) Intel
PureBasic V 5.11(X64), V 5.21(x64)

Zum Lernen ist niemand zu alt.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

sucht mal nach pthread_join.
Antworten