Thread Problem / Frage

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Thread Problem / Frage

Beitrag von X360 Andy »

Ich bastel grad einen eine "Überwachungs" Software die mehrene Cams bei anzeigen kann.
Und diese Bilder bei bedarf Lokal speichert oder direkt auf einen Server speichert...

Ist soweit fertig nun bin ich bei der Optimierung ....

Wenn ich das Prog. starte dann ist die Menü Bedienung nur mühsam da es sehr laggt ....

Ich dachte nun an einen Thread der die Anzeige der Bilder übernimmt...

Dafür hab ich den Code


Wie setzte ich das nun aber richtig ein

Code: Alles auswählen

  If ElapsedMilliseconds()-LastTime>#Time
    SendMessage_(hCaptureWnd, #WM_CAP_GRAB_FRAME, 0, 0)
    SendMessage_(hCaptureWnd, #WM_CAP_EDIT_COPY, 0, 0)
    hImg = GetClipboardImage(4, 24)
    If StartDrawing(WindowOutput(0))
        DrawImage(ImageID(4), 20, 25, 620, 455)
      StopDrawing()
    EndIf
    LastTime = ElapsedMilliseconds()
  EndIf
Ich dachte ja an

Code: Alles auswählen

Procedure anzeige(Parameter)
  If ElapsedMilliseconds()-LastTime>#Time
    SendMessage_(hCaptureWnd, #WM_CAP_GRAB_FRAME, 0, 0)
    SendMessage_(hCaptureWnd, #WM_CAP_EDIT_COPY, 0, 0)
    hImg = GetClipboardImage(4, 24)
    If StartDrawing(WindowOutput(0))
        DrawImage(ImageID(4), 20, 25, 620, 455)
      StopDrawing()
    EndIf
    LastTime = ElapsedMilliseconds()
  EndIf
Endprocedure
Aber ich bekomme leider nur Fehlermeldungen ...das Stopdrawing erst aufgerufen werden muss ...

Die Fehlermeldungen wechseln sich aber ab (:

Kann mir jemand sagen wo mein Fehler liegt ?


Hab mich noch nicht sooo richtig mit dem Thema Thread auseinander gesetzt.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

ich war der meinung 2d Lib befehle sollten laut PB-Hilfe in Threads vermieden werden...

Ist auch logisch mit StopDrawing.... Wenn thread 1 loslegt und noch nicht am Stopdraw angekommen ist und thread2 schon startdrawing machen will....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

PB 4.20 Hilfe schreibt hat geschrieben: Hinweis: Benutzen Sie innerhalb von Threads kein DirectX (MS Windows Einschränkung)! Wenn Sie auf Grafikdarstellung in Threads angewiesen sind, verwenden Sie stattdessen Images und 2DDrawing.
Aber der 2te Satz gibt sinn .... :mrgreen:

Wie könnte ich das dann lösen ?
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

mist hab ich das wieder verwechselt :o naja man wird alt ... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

X360 Andy hat geschrieben:
Wie könnte ich das dann lösen ?
Geht auch ohne Start/Stopdrawing.
Hab momentan keine Webcam angeschlossen deshalb mit "Druck"-Taste testen . ;)

Code: Alles auswählen

#Time=100
Global ende=0
Global FensterImageGadget.l
Global hCaptureWnd.l

Procedure anzeige(Parameter)
  Static LastTime.l,hImg.l
  Repeat
    If ElapsedMilliseconds()-LastTime>#Time 
      If IsImage(hImg)
        FreeImage(hImg)
      EndIf
      ; für Webcam die nächsten 2 Zeilen nutzen oder einfach auf die "Druck"-Taste drücken
      ; SendMessage_(hCaptureWnd, #WM_CAP_GRAB_FRAME, 0, 0)
      ; SendMessage_(hCaptureWnd, #WM_CAP_EDIT_COPY, 0, 0) 
      hImg = GetClipboardImage(#PB_Any, 24)
      If IsImage(hImg)
        If ImageWidth(hImg)<> 640 or ImageHeight(hImg)<> 480
          ResizeImage(hImg, 640, 480 )
        EndIf
        SendMessage_(GadgetID(FensterImageGadget),#STM_SETIMAGE,#IMAGE_BITMAP,ImageID(hImg))
      EndIf  
      LastTime = ElapsedMilliseconds()
    Else
      Delay(1)
    EndIf
  Until ende=1
Endprocedure 

;{ für Testzwecke schnell zusammengewürfelt ;)
Image = CreateImage(#PB_Any, 640, 480 )
Window_0 = OpenWindow(#PB_Any, 0, 0, 656,496, ":)")
FensterImageGadget=ImageGadget(#PB_Any,  8, 8, 640, 480, ImageID(Image),#PB_Image_Border)
;}

Thread=CreateThread(@anzeige(), 1)

Repeat
  Event  = WaitWindowEvent(40)
  Gadget = EventGadget()
  Type   = EventType()
  Window = EventWindow() 
  Select Event
    case #PB_Event_CloseWindow
      ende=1
      If Thread
        If Not WaitThread(Thread,50)
          KillThread(Thread) 
        EndIf
      EndIf
  EndSelect
Until ende=1
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Geil danke sieht super aus :allright:
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Wow 20700 Aufrufe .... welcher Bot war hier tätig ? :evil:
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

vom topic?
oh, seh grade, das dürfte etwas viel sein.
Aber eigentlich ist das auch egal, wer wo und wann was aufgerufen hat...
Win11 x64 | PB 6.20
Antworten