Re: Background running procedure
Posted: Tue Mar 09, 2010 1:04 pm
Works fine here if I remove the KillThread(). You have set the threadsafe compiler switch haven't you?
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
;StartEnumeration
Enumeration
#Win1
#Font_1
#Image_1
#Image_2
#Image_11
#Image_12
#Gad_Image_1
#Gad_Image_11
#TmrA
#TmrB
EndEnumeration
;EndEnumeration
Procedure zMayanDateCountDown()
Maya=Date(2012,12,21,0,0,0) ; Mayan Date assumed to be 21st Dec 2010, Time unknown, so midnight is assumed
Today=Date()
Remaining=Maya-Today
StartDrawing(ImageOutput(#Image_12))
DrawImage(ImageID(#Image_11), 0, 0)
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(#Font_1))
DrawText(50, 120, Str(Remaining), $000000)
DrawText(47, 117, Str(Remaining), $0000FF)
StopDrawing()
SetGadgetState(#Gad_Image_11, ImageID(#Image_12))
EndProcedure
Procedure zMaya(ParentWin)
Shared Tmr2
DisableWindow(ParentWin, 1)
Win1=OpenWindow(#Win1,0,0,400,300,"Mayan Date Countdown",#PB_Window_SystemMenu,WindowID(ParentWin))
h = LoadImage(#Image_11, #PB_Compiler_Home+"Examples\Sources\Data\terrain_texture.jpg")
ImageGadget(#Gad_Image_11, 0, 0, 400, 300, h)
DisableGadget( #Gad_Image_11, 1 )
CreateImage(#Image_12, 400,300)
Tmr2 = SetTimer_(WindowID(#Win1),#TmrB,200,@zMayanDateCountDown())
EndProcedure
Procedure zClockText()
Text.s=FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss",Date())
StartDrawing(ImageOutput(#Image_2))
DrawImage(ImageID(#Image_1), 0, 0)
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(#Font_1))
DrawText(150, 400, Text, $000000)
DrawText(147, 397, Text, $0000FF)
StopDrawing()
SetGadgetState(#Gad_Image_1, ImageID(#Image_2))
EndProcedure
LoadFont(#Font_1,"Arial",50, #PB_Font_Bold)
UseJPEGImageDecoder()
Win = OpenWindow(#PB_Any, 0, 0, 1024, 600, "Applications", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
h = LoadImage(#Image_1, #PB_Compiler_Home+"Examples\Sources\Data\terrain_texture.jpg")
ImageGadget(#Gad_Image_1, 0, 0, 1024, 600, h)
DisableGadget( #Gad_Image_1, 1 )
CreateImage(#Image_2, 1024, 600)
BodyMenu = CreateMenu(#PB_Any, WindowID(Win))
MenuTitle("File")
MenuItem(0001, "Mayan Date Countdown")
tmr1=SetTimer_(WindowID(Win),#TmrA,200,@zClockText())
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Select EventWindow()
Case Win
ExitEventLoop = #True
Case #Win1
If Tmr2
KillTimer_(WindowID(#Win1),#TmrB)
Tmr2=0
EndIf
CloseWindow(#Win1)
DisableWindow(Win,0)
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 0001
zMaya(Win)
EndSelect
EndSelect
Until ExitEventLoop
If tmr1
KillTimer_(WindowID(Win),#TmrA)
EndIf
If Tmr2
KillTimer_(WindowID(#Win1),#TmrB)
EndIf
Code: Select all
;StartEnumeration
Enumeration
#Font_1
#Image_1
#Image_2
#Image_11
#Image_12
#Gad_Image_1
#Gad_Image_11
EndEnumeration
;EndEnumeration
Procedure zClock(*Interval)
Repeat
StartDrawing(ImageOutput(#Image_2))
DrawImage(ImageID(#Image_1), 0, 0)
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(#Font_1))
DrawText(150, 450,FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss",Date()), $000000)
DrawText(147, 447,FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss",Date()), $0000FF)
StopDrawing()
SetGadgetState(#Gad_Image_1, ImageID(#Image_2))
Maya=Date(2012,12,21,0,0,0) ; Mayan Date assumed to be 21st Dec 2010, Time unknown, so midnight is assumed
Today=Date()
Remaining=Maya-Today
StartDrawing(ImageOutput(#Image_12))
DrawImage(ImageID(#Image_11), 0, 0)
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(#Font_1))
DrawText(50, 120, Str(Remaining), $000000)
DrawText(47, 117,Str(Remaining), $0000FF)
StopDrawing()
SetGadgetState(#Gad_Image_11, ImageID(#Image_12))
Delay(*Interval)
ForEver
EndProcedure
;StartProgram -------------------------------------------------------------------------------------------------------------------
LoadFont(#Font_1,"Arial",50, #PB_Font_Bold)
UseJPEGImageDecoder()
OpenWindow(0, 0, 0, 1024, 600, "Applications", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
h = LoadImage(#Image_1, #PB_Compiler_Home+"Examples\Sources\Data\terrain_texture.jpg")
ImageGadget(#Gad_Image_1, 0, 0, 1024, 600, h)
CreateImage(#Image_2, 1024, 600)
BodyMenu = CreateMenu(#PB_Any, WindowID(Win))
MenuTitle("File")
MenuItem(0001, "Mayan Date Countdown")
OpenWindow(1,0,0,400,300,"Mayan Date Countdown",#PB_Window_SystemMenu|#PB_Window_WindowCentered|#PB_Window_Invisible,WindowID(0))
h1 = LoadImage(#Image_11, #PB_Compiler_Home+"Examples\Sources\Data\terrain_texture.jpg")
ImageGadget(#Gad_Image_11, 0, 0, 400, 300, h1)
CreateImage(#Image_12, 400,300)
Thread = CreateThread(@zClock(),50)
;EndProgram
;StartEventLoop ----------------------------------------------------------------------------------------------------------------------
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
If GetActiveWindow() = 1
HideWindow(1, 1)
Else
ExitEventLoop = #True
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case 0001
HideWindow(1, 0)
;EndCase
EndSelect
;EndCase
EndSelect
Until ExitEventLoop
;EndEventLoop
Code: Select all
Procedure RunThread(param_1,param_2,param_3,param_4)
;.......................
;.......................
;.......................
EndProcedure
Procedure zClock(Parameter)
Shared param_1.i,param_2.i,param_3.i,param_4.i
RunTread(x_1, x_2,x_3,x_4)
EndProcedure
;....................................
;....................................
;....................................
Thread = CreateThread(@zClock(), Parameter)
Code: Select all
Global Dim _AppValue.i(100,1) ; Application, SubValue
Code: Select all
zGetApp(@App)
PokeI(*App,App)
_AppValue(PeekI(*App),0)=Image4 ; image number - will never be 0
_AppValue(PeekI(*App),1)=ImGad4 ; image gadget number
Code: Select all
Procedure zGetApp(*App.integer)
For i=1 To 100
If _BottomLine(i,0)=0
PokeI(*App,i)
Break
EndIf
Next
EndProcedure
Code: Select all
Thread=CreateThread(@zAppClock(), App)
Code: Select all
KillThread(Thread) : _BottomLine(App,0)=0
You sure that it's not enough? Only one integer variable is all we need, we only pass pointer to structured variable.charvista wrote:because the Thread can enter ONLY ONE integer variable, and that's not enough. I need at least two.
Code: Select all
EnableExplicit
Debug "****** Program start! ******"
Structure variables_for_thread
first_variable.i
second_variable.i
third.b
fourth.s
fifth.c[10]
EndStructure
Procedure thread1(*struct.variables_for_thread)
Debug "*** Thread start! ***"
Debug *struct\first_variable.i
Debug *struct\second_variable.i
Debug *struct\third.b
Debug *struct\fourth.s
Debug *struct\fifth.c[0]
Debug *struct\fifth.c[1]
Debug *struct\fifth.c[2]
Debug *struct\fifth.c[3]
Define i
For i=3 To 9
Debug *struct\fifth.c[i]
Next
Debug "*** Thread end! ***"
EndProcedure
Define myvariables.variables_for_thread
myvariables\first_variable.i=5
myvariables\second_variable.i = 6
myvariables\third.b=1
myvariables\fourth.s="test string"
myvariables\fifth.c[0]=255
myvariables\fifth.c[1]=5
myvariables\fifth.c[2]=10
myvariables\fifth.c[3]=15
myvariables\fifth.c[5]=25
myvariables\fifth.c[8]=40
Define thread = CreateThread(@thread1(),myvariables)
WaitThread(thread)
Debug "****** Program end! ******"