With your test program it certainly behaves as expected in that the GUI appears to freeze and is unresponsive (though it doesn't blank here) when the heavy processing is in full swing. To be expected because no processing of event messages is being performed.
The only way as I see it to perform GUI event processing during those massive sortarray's is to use a separate thread for the data processing.
Code: Select all
Global gThread
Enumeration
#Window_mainForm
#do_btn
#listview1
#listview2
EndEnumeration
EnableExplicit
Procedure.i Window_mainForm()
If OpenWindow(#Window_mainForm,0,0,600,600,"Test Blankout",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(#do_btn,450,15,90,30,"Do Something")
ListViewGadget(#listview1,10,10,400,280)
ListViewGadget(#listview2,10,300,400,280)
ProcedureReturn 1
EndIf
EndProcedure ;Window_mainForm()
Procedure load_listview()
AddGadgetItem(#listview1, -1, "item 0")
AddGadgetItem(#listview1, -1, "item 1")
AddGadgetItem(#listview1, -1, "item 2")
AddGadgetItem(#listview1, -1, "item 3")
AddGadgetItem(#listview1, -1, "item 4")
AddGadgetItem(#listview1, -1, "item 5")
AddGadgetItem(#listview1, -1, "item 6")
AddGadgetItem(#listview1, -1, "item 7")
AddGadgetItem(#listview2, -1, "item 0")
AddGadgetItem(#listview2, -1, "item 1")
AddGadgetItem(#listview2, -1, "item 2")
AddGadgetItem(#listview2, -1, "item 3")
AddGadgetItem(#listview2, -1, "item 4")
AddGadgetItem(#listview2, -1, "item 5")
AddGadgetItem(#listview2, -1, "item 6")
AddGadgetItem(#listview2, -1, "item 7")
EndProcedure
Procedure do_something(value)
Protected i, j.f, k.f, size, iterations
size = 2*1000*1000*100 ; ~10 seconds to process
iterations = 1
Dim testarray.f(size)
For i = 1 To iterations
; CreateFile(1,"erase_me.txt")
; WriteStringN(1, "a line of text")
; CloseFile(1)
; DeleteFile("erase_me.txt")
j = i
k = j / 0.5347
testarray(i) = k
SortArray(testarray(),#PB_Sort_Descending)
Next i
MessageRequester("","Done")
gThread = 0
EndProcedure
Define event
Define quitmainForm=0
Define windowOpened
Define thread
windowOpened = Window_mainForm()
If windowOpened
load_listview()
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Window_mainForm
quitmainForm=1
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #do_btn
Select EventType()
Case #PB_EventType_LeftClick
If gThread = 0
gThread = CreateThread(@do_something(), 0)
EndIf
EndSelect
EndSelect ;EventGadget()
EndSelect ;event
Until quitmainForm
If gThread
KillThread(gThread)
EndIf
CloseWindow(#Window_mainForm)
EndIf ;windowOpened