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.
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

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.