Seite 1 von 1

Gadget Handle in Procedure übergeben

Verfasst: 05.01.2010 16:39
von alen
Hallo,

ich versuche mich gerade wieder in PB und bin auf ein Problem gestossen.
Dabei würde ich gerne einen Handle eines Gadgets in eine Procedure übergeben.

Jedoch wird die Procedure in einem neuen Thread aufgerufen.

Code: Alles auswählen

CreateThread(@WhatEver(), 50)
Dabei kann man nur einen Parameter mitgeben.
Was ich schon versucht habe war, das Handle als Global zu definieren aber es kommt in der Procedure nichts an.

Hat jemand einen Vorschlag wie man das lösen könnte?
Für Lösungsvorschläge wäre ich sehr dankbar.

Grüße
Alen

Re: Gadget Handle in Procedure übergeben

Verfasst: 05.01.2010 16:50
von STARGÅTE
die Globaldefinition muss vor der Procedure (oder jedem anderm Aufruf der Variablen) stehen:

zB:

Code: Alles auswählen


#Window_Width  = 800
#Window_Height = 600



Global GadgetHandle

Procedure WhatEver(Start)
  Repeat
    Delay(100) 
    SetGadgetText(GadgetHandle, Str(Start))
    Start + 1
  ForEver
EndProcedure


OpenWindow(0, 0, 0, #Window_Width, #Window_Height, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 
GadgetHandle = ButtonGadget(#PB_Any, 10, 10, 300, 20, "")

CreateThread(@WhatEver(), 50) 

Repeat

  Event = WaitWindowEvent()
 
  Select Event
 
    Case #PB_Event_CloseWindow
      End
 
  EndSelect

ForEver

Re: Gadget Handle in Procedure übergeben

Verfasst: 05.01.2010 16:57
von mk-soft
Wie sieht denn deine Procdure aus? Hat es denn ein Parameter?

Hier mal ein Beispiel wie es gehen kann.

Beispiel mal mit Strukturen geändert

Code: Alles auswählen

;- Konstanten
Enumeration ; Window ID
  #Window
EndEnumeration

Enumeration ; Menu ID
  #Menu
EndEnumeration

Enumeration ; MenuItem ID
  #Menu_Exit
EndEnumeration

Enumeration ; Statusbar ID
  #Statusbar
EndEnumeration

Enumeration ; Gadget ID
  #List
EndEnumeration

; ***************************************************************************************

Procedure UpdateWindow()

  Protected x,y,dx,dy
  Protected mn,st,tb
  
  x = 0
  y = 0
  mn = MenuHeight()
  st = StatusBarHeight(#StatusBar)
  ;tb = ToolBarHeight(#ToolBar)
  dx = WindowWidth(#Window)
  dy = WindowHeight(#Window) - mn - st - tb
  ResizeGadget(#List, x, y, dx, dy)
  
EndProcedure

Procedure WriteLog(Info.s)
  Protected temp.s
  temp = FormatDate("%YYYY.%MM.%DD %HH:%II:%SS - ", Date()) + Info
  AddGadgetItem(#List, -1, temp)
  If CountGadgetItems(#List) > 500
    RemoveGadgetItem(#List, 0)
  EndIf
EndProcedure

;- Globale Variablen
Global exit = 0

Structure udtThread
  gadget.i
  count.i
  info.s
EndStructure

Global mutex

Global Thread1.udtThread
Global Thread2.udtThread

Declare MyThread(*this.udtThread)

;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
  ; Menu
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_Exit, "Be&enden")
  EndIf
  ; Statusbar
  CreateStatusBar(#Statusbar, WindowID(#Window))
  ; Gadgets
  If CreateGadgetList(WindowID(#Window))
    ListViewGadget(#List, 0,0,0,0)
  EndIf
  
  ; Mutex erstellen - Spart man Threadsafe
  mutex = CreateMutex()
  
  ;- Start Thread
  With Thread1
    \gadget = #List
    \count = 10
    \info = "Thread 1"
  EndWith
  
  With Thread2
    \gadget = #List
    \count = 15
    \info = "Thread 2"
  EndWith
  
  hThread1 = CreateThread(@MyThread(), Thread1)
  hThread2 = CreateThread(@MyThread(), Thread2)
    
  ;-- Hauptschleife
  Repeat
    event   = WaitWindowEvent()
    window  = EventWindow()
    menu    = EventMenu()
    type    = EventType()
    Select event
      Case #PB_Event_Menu
        Select menu
          Case #Menu_Exit
            Exit = 1
        EndSelect
      Case #PB_Event_Gadget
      Case #PB_Event_CloseWindow
        Exit = 1
      Case #PB_Event_Repaint
      Case #PB_Event_SizeWindow
        UpdateWindow()
        
      Case #PB_Event_MoveWindow
      Case #PB_Event_ActivateWindow
      Case #PB_Event_SysTray
    
    EndSelect
    
  Until Exit
EndIf

; ***************************************************************************************

Procedure MyThread(*this.udtThread)

  Protected temp.s
  
  If IsGadget(*this\gadget) = 0
    ; fehler
    ProcedureReturn 0
  EndIf
  
  LockMutex(mutex)
  temp = *this\info + ": Start..."
  AddGadgetItem(*this\gadget, -1, temp)
  UnlockMutex(mutex)
  
  For i = 1 To *this\count
    LockMutex(mutex)
    temp = *this\info + ": Count " + Str(i)
    AddGadgetItem(*this\gadget, -1, temp)
    UnlockMutex(mutex)
    Delay(1000)
  Next
  
  LockMutex(mutex)
  temp = *this\info + ": Ready."
  AddGadgetItem(*this\gadget, -1, temp)
  UnlockMutex(mutex)
  
EndProcedure

Re: Gadget Handle in Procedure übergeben

Verfasst: 05.01.2010 17:15
von mk-soft
Habe das Beispiel auf Strukurdaten geändert um zu zeigen wie man mehrere Daten an ein Thread übergibt.

FF :wink:

Re: Gadget Handle in Procedure übergeben

Verfasst: 05.01.2010 17:47
von AND51
Man könnte auch mit AllocateMemory() einen kleinen Speicherbereich erstellen, indem man alle nötigen Daten (Gadgethandles, etc.) reinschreibt. Dann übergibt man einfach nur den *Pointer dieses Speicherbereichs an den Thread/die Prozedur. Die kann die Daten dann auslesen und den Speicherbereich mit FreeMemory() löschen.