Posts: 66
Threads: 19
Joined: May 2015
I run a macro frequently (thousands of times) but occasionally QM seems to just freeze with the QM icon pink (not blue) in the bottom windows toolbar to show it is still running but no further processing takes place.
I am happy there is not an infinite loop or a bug in the code and qm does not crash but just freezes.
Is there a way I can get qm to continue without pressing break and restarting the macro ? I do not want to do this as I lose data.
Any tips on solving this problem and identifying the cause would be appreciated.
Thank you
Posts: 12,073
Threads: 140
Joined: Dec 2002
Need the macro. Then possibly we can find a solution.
Posts: 66
Threads: 19
Joined: May 2015
[codeFunction
outt
/
function str'text
;Writes text to file "$my qm$\LogFileFast.txt". Appends newline.
;This function is fast, faster than out. Writes to file asynchronously, every 1 s and when QM exits.
;Deletes old file when called first time in current QM session.
;To change file, edit this function. Or execute this when QM starts, before calling this function first time: str+ g_LFF_File="C:\...\your file\txt"
lock _LogFileFast
str+ g_LFF_File __LFF_Buffer
int+ __LFF_Thread
__Handle+ __LFF_Event
if !__LFF_Thread
,if(!g_LFF_File.len) g_LFF_File="$my qm$\mydata\LogFileFast.txt"
,if(FileExists(g_LFF_File)) del- g_LFF_File; err out "Error in LogFileFast: failed to delete old file."
,__LFF_Buffer.flags=3
,__LFF_Event=CreateEvent(0 0 0 0)
,__LFF_Thread=10
,mac "sub.Thread"
__LFF_Buffer.addline(text)
lock- _LogFileFast
if(__LFF_Buffer.len>4000000) SetEvent __LFF_Event; 0.001
#sub Thread
atend sub.Atend
rep
,wait 1 H __LFF_Event; err
,if(__LFF_Buffer.len) sub.WriteToFile
#sub WriteToFile
lock _LogFileFast
__LFF_Buffer.swap(_s)
lock- _LogFileFast
_s.setfile(g_LFF_File -1); err out "Error in LogFileFast: failed to write to file."
#sub Atend
if(__LFF_Buffer.len) sub.WriteToFile
][/code]
Posts: 12,073
Threads: 140
Joined: Dec 2002
Difficult. Are you sure that the macro is executing this function when freezes? Try to use function LogFile instead.
Posts: 66
Threads: 19
Joined: May 2015
Yes I believe this is the function which is being executed when QM freezes.
It happens very rarely and I execute that function thousands of times often many times per second without it freezing.
I will experiment with LogFile but I just need something with writes to a file fast.
Posts: 12,073
Threads: 140
Joined: Dec 2002
This is not as fast as LogFileFast, but much faster than LogFile.
Function
LogFileFaster
;/
function str'text
;Writes text to file "$my qm$\LogFileFaster.txt". Appends newline.
;Deletes old file when called first time in current QM session.
;To change file, edit this function. Or execute this when QM starts, before calling this function first time: str+ g_LFF_File="C:\...\your file.txt"
;Faster than LogFile which opens and closes the file each time. This function opens the file when called first time, and it is closed when QM exits or opens another QM file.
;Tested speed:
;When called very frequently - 9 mcs with cold CPU, 1 mcs with warm CPU.
;When called after some time - 30-60 mcs with cold CPU, 10-30 mcs with warm CPU.
;LogFile speed is > 100 mcs.
opt noerrorshere 1
str+ g_LFF_File
__HFile+ __LFF_HFile
if !__LFF_HFile
,lock
,if !__LFF_HFile
,,if(!g_LFF_File.len) g_LFF_File="$my qm$\LogFileFaster.txt"
,,__LFF_HFile.Create(g_LFF_File CREATE_ALWAYS GENERIC_WRITE FILE_SHARE_READ) ;;error if fails
,lock-
text+"[]"
if(!WriteFile(__LFF_HFile text text.len &_i 0)) end "failed" 8|16 ;;warning if fails
;WriteFile does not write to disk immediately. It writes to a file buffer in memory, which is regularly written to disk, maybe every several seconds.
Posts: 66
Threads: 19
Joined: May 2015
Brilliant thank you.
I will test this code and see how it performs
Posts: 2
Threads: 0
Joined: Jul 2017