Seite 1 von 1

Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 10:03
von funkheld
Hallo, guten Tag.

Was ist der Vorteil/Nachteil bitte von einem Thread oder einem Process in einer anderen EXE die mit Sendmessage und Filemap gesteuert wird vom Hauptprogramm ?

Danke.
Gruss

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 11:49
von RSBasic
Ich verstehe leider die Frage nicht.
Ein Thread ist ein Teil eines Prozesses und ein Prozess ist die komplette Anwendung bzw. die EXE-Datei.

Ich kann dir nur die Vor- und Nachteile eines Threads nennen:
Vorteil: Läuft unabhängig
Nachteil: Läuft langsamer

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 13:33
von Sicro
Ich denke, er will die Vorteile / Nachteile zwischen folgenden Methoden wissen:

Methode 1

Code: Alles auswählen

Procedure Thread(*Parameter)
  ; Code
EndProcedure

CreateThread(@Thread(), 0)
Methode 2
Hauptprogramm:

Code: Alles auswählen

RunProgram("Programm2.exe")
; ...
SetFileMapData(...)
SendMessage_(WindowHandleFromProgram2Window, Message, ...)
Nebenprogramm (Program2.exe):

Code: Alles auswählen

Procedure Callback(hWnd, uMsg, wParam, lParam)
  If uMsg = #MyMessage
    ; FileMap lesen, die vom Hauptprogramm mit Daten gefüllt wurde
  EndIf
 
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure
; ...
SetWindowCallback(@Callback())

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 14:19
von funkheld
Ja danke, so meine ich es.
Habe mich wohl nicht so richtig ausgedrückt.

Danke.
Gruss

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 15:52
von RSBasic
Ich würde grundsätzlich alles in einer Anwendung machen. Wenn du wiederverwendbare Funktionen für mehrere Programme bereitstellen möchtest, kannst du diese in einer DLL- oder Anwendungsdatei einfügen.
Du kannst diese natürlich auch in einer Include-Datei einfügen, die von mehreren, verschiedenen Quellcodes/Projekten verwendet werden können.
Es kommt immer darauf an, was du machen möchtest. Was möchtest du denn genau machen bzw. was macht deine Anwendung genau?

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 17:22
von funkheld
Ich möchte in einem Programm den Roboter steuern mit/über Wlan und dort auch Grafisch die Daten darstellen.
Der Input zum Steuern des Roboter soll vom Hauptprogramm kommen, welches auch noch serielle Daten empfangen soll.
Das steuern des Roboter mache ich mit Sendmessage vom Hauptprogramm.
Das Hauptprogramm soll mit dem Wlan außen vor gelassen werden, weil Wlan doch sehr Zeitintensive ist.

Darum wollte ich es trennen, weil die Wlan-Daten ca 100 ms dauern pro Ultraschallmessung des Roboters.

Gruss

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 17:27
von RSBasic
Ich würde das in einem Programm machen und nicht getrennt. Du hast ja z.B. mit Threads die Möglichkeit, mehrere Vorgänge gleichzeitig laufen zu lassen.
Außerdem ist es für dich einfacher, auf die empfangenen Daten u.ä. zuzugreifen.

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 18:35
von Sicro
In dem Fall wäre ein Thread mit einer Warteschlange am besten. Das Hauptprogramm kann flüssig weiter bedient werden, während sich der Thread um die träge Verarbeitung der Aufgaben kümmert.
So in etwa:

Code: Alles auswählen

Structure QueueStruc
  Command.i
  Parameter1.i ; z. B. die Zeit, wie lange der Befehl ausgeführt werden soll
  Parameter2.i
  Parameter3.i
  Parameter4.i
  ; ...
EndStructure

Structure ThreadDataStruc
  List Queue.QueueStruc()
  ExitThread.i
EndStructure

Enumeration Command
  #Robot_Move_Forward
  #Robot_Move_Backward
  ; ...
EndEnumeration

Procedure Thread(*void)
  Shared Mutex, ThreadData
 
  Repeat
    ForEach ThreadData\Queue()
      If LockMutex(Mutex)
        Select Command
          Case #Robot_Move_Forward
            ; Aufgabe ausführen
          Case #Robot_Move_Backward
            ; Aufgabe ausführen
        EndSelect
        UnlockMutex(Mutex)
      EndIf
    Next
  Until ThreadData\ExitThread
EndProcedure

Procedure AddToQueue(Command, Parameter1=0, Parameter2=0, Parameter3=0, Parameter4=0)
  Shared Mutex, ThreadData
 
  If LockMutex(Mutex) And AddElement(ThreadData\Queue())
    With ThreadData\Queue()
      \Command    = Command
      \Parameter1 = Parameter1
      \Parameter2 = Parameter2
      \Parameter3 = Parameter3
      \Parameter4 = Parameter4
    EndWith
  EndIf
EndProcedure

Define.ThreadDataStruc ThreadData
Define Mutex  = CreateMutex()
Define Thread = CreateThread(@Thread(), 0)

OpenWindow(...)
; ...

Repeat
  Event = WaitWindowEvent()
 
  If Event = #PB_Event_Gadget And EventGadget() = #Button_Robot_Move_Forward
    AddToQueue(#Robot_Move_Forward)
    Debug "'Roboter nach vorne bewegen' wurde zur Warteschlange hinzugefügt!"
  EndIf
Until Event = #PB_Event_CloseWindow

Debug "Warten wir noch bis die Warteschlange sauber abgebrochen wurde..."
ThreadData\ExitThread = #True
WaitThread(Thread)
Debug "Ok, Programm wird beendet!"
Edit [19:04]: Code wurde verbessert.

Re: Thread oder Prozess im einer anderen EXE?

Verfasst: 24.04.2016 19:33
von funkheld
Ja danke für die große Hilfe.
Werden mich noch einmal mit den Threads auseinandersetzen.

Gruss