Seite 1 von 1

Thread Problem / Frage

Verfasst: 09.02.2009 17:22
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.

Verfasst: 09.02.2009 17:25
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....

Verfasst: 09.02.2009 17:28
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 ?

Verfasst: 09.02.2009 17:58
von Bisonte
mist hab ich das wieder verwechselt :o naja man wird alt ... ;)

Verfasst: 09.02.2009 23:41
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

Verfasst: 10.02.2009 07:39
von X360 Andy
Geil danke sieht super aus :allright:

Verfasst: 10.02.2009 16:49
von X360 Andy
Wow 20700 Aufrufe .... welcher Bot war hier tätig ? :evil:

Verfasst: 10.02.2009 17:51
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...