Linux - Thread und GTK
Verfasst: 25.07.2007 20:27
Bei meinen ersten geh versuche in Linux ich habe festgestellt das die GTK etwas empfindlich gestört wird wenn man versucht aus einen Thread Gadgets zu bearbeiten.
Habe das ganze mal umgangen mit einen kleinen Message-System
Testcode:
Includecode "message.pb":
FF 
(EDIT) Geht natürlich auch unter Windows
Habe das ganze mal umgangen mit einen kleinen Message-System

Testcode:
Code: Alles auswählen
EnableExplicit
;- 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
;- Globale Variablen
Global exit = 0
IncludeFile "message.pb"
Define.l style, event, window, menu, type
Declare MyThread(id)
;- 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))
AddStatusBarField(1024)
; Gadgets
If CreateGadgetList(WindowID(#Window))
ListViewGadget(#List, 0,0,0,0)
EndIf
UpdateWindow()
CreateThread(@MyThread(), 1)
;-- Hauptschleife
Repeat
event = WaitWindowEvent(20)
window = EventWindow()
menu = EventMenu()
type = EventType()
; Messages abarbeiten
GetMessage()
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(id)
PutMessage(#List, #additemtext, 0, "Thread startet...")
Delay(500)
While exit = 0
PutMessage(#List, #additemtext, 0, "Thread läuft...")
Delay(1000)
Wend
EndProcedure
; ***************************************************************************************
Code: Alles auswählen
;-TOP
; Kommentar :
; Author : mk-soft
; Second Author :
; Datei : message.pb
; Version : 1.01
; Erstellt : 25.07.2007
; Geändert :
;
; Compilermode :
;
; ***************************************************************************************
;- Messages
Enumeration 100
#settext
#additemtext
#insertitemtext
EndEnumeration
; ***************************************************************************************
Structure udtMessage
id.l
msg.l
value.l
text.s
EndStructure
Global NewList ListMessage.udtMessage()
Global MutexMessage
MutexMessage = CreateMutex()
; ***************************************************************************************
Procedure PutMessage(id.l, msg.l, value.l = 0, text.s = "")
LockMutex(MutexMessage)
AddElement(ListMessage())
With ListMessage()
\id = id
\msg = msg
\value = value
\text = text
EndWith
UnlockMutex(MutexMessage)
EndProcedure
; ***************************************************************************************
Procedure GetMessage()
LockMutex(MutexMessage)
ForEach ListMessage()
With ListMessage()
; Messages ToDo
Select \msg
Case #settext
SetGadgetText(\id, \text)
Case #additemtext
AddGadgetItem(\id, -1, \text)
Case #insertitemtext
AddGadgetItem(\id, \value, \text)
EndSelect
EndWith
Next
ClearList(ListMessage())
UnlockMutex(MutexMessage)
EndProcedure

(EDIT) Geht natürlich auch unter Windows