Updated by Jim Fritts on 2020-AUG-18
Designed to run on Windows 10 2004
Platform: PBWIN10 and J. Roca includes
To use this program as is you will need to download Gary Beene's sample files from here.
Replace his Threads.bas with this app.
As a comparison Gary's unmodified code ran 6.1 minutes for 2000 files.
My modified version uses 11 threads and ran 12.4 seconds for 2000 files.
Comments here please:
Designed to run on Windows 10 2004
Platform: PBWIN10 and J. Roca includes
To use this program as is you will need to download Gary Beene's sample files from here.
Replace his Threads.bas with this app.
As a comparison Gary's unmodified code ran 6.1 minutes for 2000 files.
My modified version uses 11 threads and ran 12.4 seconds for 2000 files.
Comments here please:
Code:
'Compilable Example: #COMPILE EXE "threads.exe" #DIM ALL 'Updated by Jim Fritts on 2020-AUG-18 'Designed to run on Windows 10 2004 'Platform: PBWIN10 and J. Roca includes 'To use this program as is you will need to download Gary Beene's sample files from 'http://www.garybeene.com/files/threads.zip 'Replace his Threads.bas with this app. 'As a comparison Gary's unmodified code ran 6.1 minutes for 2000 files. 'My modified version uses 11 threads and ran 12.4 seconds for 2000 files. 'Comments here please: 'https://forum.powerbasic.com/forum/user-to-user-discussions/programming/798049-effect-of-multiple-threads?p=798357#post798357 #DEBUG ERROR ON #DEBUG DISPLAY ON %Unicode = 1 #INCLUDE "Win32API.inc" #RESOURCE ICON logo, "index.ico" ENUM Equates SINGULAR IDC_Stop = 1500 IDC_Start IDC_Next IDC_Finished END ENUM GLOBAL hDlg AS LONG GLOBAL StopAction AS LONG GLOBAL URLsPerThread AS LONG GLOBAL ThreadsCount AS LONG GLOBAL hThread01, _ hThread02, _ hThread03, _ hThread04, _ hThread05, _ hThread06, _ hThread07, _ hThread08, _ hThread09, _ hThread10, _ hThreadStore AS DWORD GLOBAL URLS() AS STRING 'file name array shared between main app and storage thread GLOBAL StartTime AS STRING GLOBAL qFreq AS QUAD GLOBAL qStart AS QUAD GLOBAL qStop AS QUAD GLOBAL StartPT AS LONG GLOBAL NextPT AS LONG GLOBAL SequencePT AS LONG GLOBAL giWipedFolder AS LONG GLOBAL StoreIt AS LONG GLOBAL giThread01 AS LONG GLOBAL giThread02 AS LONG GLOBAL giThread03 AS LONG GLOBAL giThread04 AS LONG GLOBAL giThread05 AS LONG GLOBAL giThread06 AS LONG GLOBAL giThread07 AS LONG GLOBAL giThread08 AS LONG GLOBAL giThread09 AS LONG GLOBAL giThread10 AS LONG GLOBAL giThreadStore AS LONG GLOBAL File01() AS STRING 'unshared between modification threads GLOBAL File02() AS STRING 'unshared between modification threads GLOBAL File03() AS STRING 'unshared between modification threads GLOBAL File04() AS STRING 'unshared between modification threads GLOBAL File05() AS STRING 'unshared between modification threads GLOBAL File06() AS STRING 'unshared between modification threads GLOBAL File07() AS STRING 'unshared between modification threads GLOBAL File08() AS STRING 'unshared between modification threads GLOBAL File09() AS STRING 'unshared between modification threads GLOBAL File10() AS STRING 'unshared between modification threads GLOBAL PROCESSIT() AS LONG 'control array shared between modification threads GLOBAL FINISHEDIT() AS LONG 'control array shared between modification threads GLOBAL giAppRunning AS LONG GLOBAL FileTotal AS LONG GLOBAL BreakTime AS LONG FUNCTION PBMAIN() AS LONG LOCAL i AS LONG LOCAL Time AS TIMECAPS TimeGetDevCaps ( Time, SIZEOF(Time) ) timeBeginPeriod (Time.wPeriodMin) SLEEP 16 DIM PROCESSIT(1 TO 10) AS LONG DIM FINISHEDIT(1 TO 10) AS LONG FileTotal = 2000 DIM File01(1 TO FileTotal/10) AS GLOBAL STRING DIM File02(1 TO FileTotal/10) AS GLOBAL STRING DIM File03(1 TO FileTotal/10) AS GLOBAL STRING DIM File04(1 TO FileTotal/10) AS GLOBAL STRING DIM File05(1 TO FileTotal/10) AS GLOBAL STRING DIM File06(1 TO FileTotal/10) AS GLOBAL STRING DIM File07(1 TO FileTotal/10) AS GLOBAL STRING DIM File08(1 TO FileTotal/10) AS GLOBAL STRING DIM File09(1 TO FileTotal/10) AS GLOBAL STRING DIM File10(1 TO FileTotal/10) AS GLOBAL STRING DIALOG DEFAULT FONT "Tahoma",12, 0 DIALOG NEW PIXELS, 0, "Process 2000 Threads",,,600,70, %WS_OVERLAPPEDWINDOW TO hDlg DIALOG SET ICON hDlg, "logo" CONTROL ADD BUTTON, hDlg, %IDC_Start,"Start", 10,10,70,25 CONTROL ADD BUTTON, hDlg, %IDC_Stop,"Stop", 90,10,70,25 DIALOG SHOW MODAL hDlg CALL DlgProc END FUNCTION CALLBACK FUNCTION DlgProc() AS LONG SELECT CASE CB.MSG CASE %WM_INITDIALOG IF ISFALSE ISFOLDER("threads_formatted") THEN MKDIR "threads_formatted" 'Settings_INI "get" CALL LoadURLs '1 to FileTotal QueryPerformanceFrequency qFreq giAppRunning = 1 StartPT = 1 BreakTime = 10 CALL Load10Files CASE %WM_DESTROY winbeep(3000, 75) giAppRunning = 0 Settings_INI "save" CASE %WM_COMMAND SELECT CASE CB.CTL CASE %IDC_Stop : StopAction = 1 CASE %IDC_Start : ThreadsCount = 10 : URLsPerThread = 1 : ProcessFiles CASE %IDC_Next IF FileTotal >= 2000 THEN IF StopAction = 0 AND giAppRunning = 1 AND StartPT < 2000 - 10 THEN '< for all 2000 files 'CALL ShowData StartPT = NextPT CALL Load10Files 'call ShowData CALL SendFireCommand ELSE StoreIt = 1 'signal thread to store files END IF END IF CASE %IDC_Finished 'there will be a small time delay here QueryPerformanceCounter qStop DIALOG SET TEXT hDlg, "Processing Threads ... " + _ FORMAT$(UBOUND(URLS), "##,##0") + " " + _ Legend + " " + StartTime + " " + _ TIME$ + " " + FORMAT$((qStop-qStart)/qFreq,"###.0") & "s" ? "Success!" IF SequencePT = FileTotal/10 THEN EXIT SELECT IF FileTotal > 2000 THEN NextPT = 1 StartPT = NextPT CALL Load10Files 'call ShowData CALL SendFireCommand END IF END SELECT END SELECT END FUNCTION SUB ShowData ? "URL 1=" & URLs(1) & $CRLF & _ "URL 2000=" & URLs(2000) & $CRLF & $CRLF & _ "Temp String 1 Length=" & STR$(LEN(File01(SequencePT))) & $CRLF & _ "Temp String 2 Length=" & STR$(LEN(File02(SequencePT))) & $CRLF & _ "Temp String 3 Length=" & STR$(LEN(File03(SequencePT))) & $CRLF & _ "Temp String 4 Length=" & STR$(LEN(File04(SequencePT))) & $CRLF & _ "Temp String 5 Length=" & STR$(LEN(File05(SequencePT))) & $CRLF & _ "Temp String 6 Length=" & STR$(LEN(File06(SequencePT))) & $CRLF & _ "Temp String 7 Length=" & STR$(LEN(File07(SequencePT))) & $CRLF & _ "Temp String 8 Length=" & STR$(LEN(File08(SequencePT))) & $CRLF & _ "Temp String 9 Length=" & STR$(LEN(File09(SequencePT))) & $CRLF & _ "Temp String 10 Length=" & STR$(LEN(File10(SequencePT)))& $CRLF & $CRLF & _ "10 files were loaded."& $CRLF & _ "The next group starts at " & STR$(NextPT) & $CRLF & _ "Data Arrays Sequence Number=" & STR$(SequencePT) END SUB FUNCTION Legend() AS STRING : FUNCTION = STR$(ThreadsCount) + "x" + FORMAT$(URLsPerThread,"###0") : END FUNCTION SUB LoadURLs LOCAL i AS LONG REDIM URLs(1 TO FileTotal) URLs(1) = DIR$("threads\*.htm") FOR i = 2 TO UBOUND(URLs) : URLs(i) = DIR$(NEXT) : NEXT i END SUB SUB Load10Files LOCAL i01 AS LONG LOCAL i02 AS LONG LOCAL i03 AS LONG LOCAL i04 AS LONG LOCAL i05 AS LONG LOCAL i06 AS LONG LOCAL i07 AS LONG LOCAL i08 AS LONG LOCAL i09 AS LONG LOCAL i10 AS LONG INCR SequencePT 'just open, read, and close 10 files i01 = FREEFILE OPEN "threads\" + URLs(StartPT + 0) FOR BINARY AS #i01 : GET$ #i01, LOF(#i01), File01(SequencePT) : CLOSE #i01 i02 = FREEFILE OPEN "threads\" + URLs(StartPT + 1) FOR BINARY AS #i02 : GET$ #i02, LOF(i02), File02(SequencePT) : CLOSE #i02 i03 = FREEFILE OPEN "threads\" + URLs(StartPT + 2) FOR BINARY AS #i03 : GET$ #i03, LOF(i03), File03(SequencePT) : CLOSE #i03 i04 = FREEFILE OPEN "threads\" + URLs(StartPT + 3) FOR BINARY AS #i04 : GET$ #i04, LOF(i04), File04(SequencePT) : CLOSE #i04 i05 = FREEFILE OPEN "threads\" + URLs(StartPT + 4) FOR BINARY AS #i05 : GET$ #i05, LOF(i05), File05(SequencePT) : CLOSE #i05 i06 = FREEFILE OPEN "threads\" + URLs(StartPT + 5) FOR BINARY AS #i06 : GET$ #i06, LOF(i06), File06(SequencePT) : CLOSE #i06 i07 = FREEFILE OPEN "threads\" + URLs(StartPT + 6) FOR BINARY AS #i07 : GET$ #i07, LOF(i07), File07(SequencePT) : CLOSE #i07 i08 = FREEFILE OPEN "threads\" + URLs(StartPT + 7) FOR BINARY AS #i08 : GET$ #i08, LOF(i08), File08(SequencePT) : CLOSE #i08 i09 = FREEFILE OPEN "threads\" + URLs(StartPT + 8) FOR BINARY AS #i09 : GET$ #i09, LOF(i09), File09(SequencePT) : CLOSE #i09 i10 = FREEFILE OPEN "threads\" + URLs(StartPT + 9) FOR BINARY AS #i10 : GET$ #i10, LOF(i10), File10(SequencePT) : CLOSE #i10 NextPT = StartPT + 10 END SUB SUB Settings_INI(Task$) LOCAL xResult, yResult, tempZ, INIFileName AS WSTRINGZ * %MAX_PATH, WinPla AS WindowPlacement 'set ini filename INIFileName = EXE.PATH$ + "threads.ini" IF Task$ = "get" THEN 'get dialog width/height from INI file and use to set Dialog size GetPrivateProfileString "All", "Width", "1070", xResult, %MAX_PATH, INIFileName GetPrivateProfileString "All", "Height", "125", yResult, %MAX_PATH, INIFileName DIALOG SET SIZE hDlg,VAL(xResult), VAL(yResult) 'width/height 'default position should be centered on screen LOCAL DefaultX, DefaultY, wDeskTop, hDeskTop AS LONG DESKTOP GET CLIENT TO wDeskTop, hDeskTop DefaultX = (wDeskTop-VAL(xResult))/2 DefaultY = (hDeskTop-VAL(yResult))/2 'get dialog top/left from INI file and use to set Dialog location Getprivateprofilestring "All", "Left", STR$(DefaultX), xResult, %MAX_PATH, INIFileName Getprivateprofilestring "All", "Top", STR$(DefaultY), yResult, %MAX_PATH, INIFileName DIALOG SET LOC hDlg, VAL(xResult), VAL(yResult) 'left/top END IF IF Task$ = "save" THEN 'If Len(Dir$(INIFileName)) Then Kill INIFileName 'save dialog size/location unless minimized or maximized WinPla.length = SIZEOF(WinPla) GetWindowPlacement hDlg, WinPla WritePrivateProfileString "All", "Left", STR$(WinPla.rcNormalPosition.nLeft), INIFileName WritePrivateProfileString "All", "Top", STR$(WinPla.rcNormalPosition.nTop), INIFileName WritePrivateProfileString "All", "Width", STR$(WinPla.rcNormalPosition.nRight - WinPla.rcNormalPosition.nLeft), INIFileName WritePrivateProfileString "All", "Height", STR$(WinPla.rcNormalPosition.nBottom - WinPla.rcNormalPosition.nTop), INIFileName WritePrivateProfileString "All", "MinMaxState", STR$(WinPla.showCmd), INIFileName END IF END SUB SUB ProcessFiles LOCAL i AS LONG StopAction = 0 StartTime = TIME$ QueryPerformanceCounter qStart DIALOG SET TEXT hDlg, "Processing Threads ... " + _ FORMAT$(UBOUND(URLS), "##,##0") + " " + _ Legend + " " + StartTime IF giThread01 = 0 OR _ giThread02 = 0 OR _ giThread03 = 0 OR _ giThread04 = 0 OR _ giThread05 = 0 OR _ giThread06 = 0 OR _ giThread07 = 0 OR _ giThread08 = 0 OR _ giThread09 = 0 OR _ giThread10 = 0 THEN CALL CreateTheThreads END IF CALL SendFireCommand END SUB SUB CreateTheThreads StopAction = 0 IF giThread01 = 0 THEN THREAD CREATE FormatThreads01(999) TO hThread01 : THREAD CLOSE hThread01 TO hThread01 END IF IF giThread02 = 0 THEN THREAD CREATE FormatThreads02(999) TO hThread02 : THREAD CLOSE hThread02 TO hThread02 END IF IF giThread03 = 0 THEN THREAD CREATE FormatThreads03(999) TO hThread03 : THREAD CLOSE hThread03 TO hThread03 END IF IF giThread04 = 0 THEN THREAD CREATE FormatThreads04(999) TO hThread04 : THREAD CLOSE hThread04 TO hThread04 END IF IF giThread05 = 0 THEN THREAD CREATE FormatThreads05(999) TO hThread05 : THREAD CLOSE hThread05 TO hThread05 END IF IF giThread06 = 0 THEN THREAD CREATE FormatThreads06(999) TO hThread06 : THREAD CLOSE hThread06 TO hThread06 END IF IF giThread07 = 0 THEN THREAD CREATE FormatThreads07(999) TO hThread07 : THREAD CLOSE hThread07 TO hThread07 END IF IF giThread08 = 0 THEN THREAD CREATE FormatThreads08(999) TO hThread08 : THREAD CLOSE hThread08 TO hThread08 END IF IF giThread09 = 0 THEN THREAD CREATE FormatThreads09(999) TO hThread09 : THREAD CLOSE hThread09 TO hThread09 END IF IF giThread10 = 0 THEN THREAD CREATE FormatThreads10(999) TO hThread10 : THREAD CLOSE hThread10 TO hThread10 END IF IF giThreadStore = 0 THEN THREAD CREATE StoreThreads(999) TO hThreadStore : THREAD CLOSE hThreadStore TO hThreadStore END IF 'wait for threads to start running SLEEP 20 END SUB SUB SendFireCommand TryAgain: 'Send Command to Fire up processing IF giAppRunning = 1 AND _ giThread01 = 1 AND _ giThread02 = 1 AND _ giThread03 = 1 AND _ giThread04 = 1 AND _ giThread05 = 1 AND _ giThread06 = 1 AND _ giThread07 = 1 AND _ giThread08 = 1 AND _ giThread09 = 1 AND _ giThread10 = 1 AND _ PROCESSIT(1) = 0 AND _ PROCESSIT(2) = 0 AND _ PROCESSIT(3) = 0 AND _ PROCESSIT(4) = 0 AND _ PROCESSIT(5) = 0 AND _ PROCESSIT(6) = 0 AND _ PROCESSIT(7) = 0 AND _ PROCESSIT(8) = 0 AND _ PROCESSIT(9) = 0 AND _ PROCESSIT(10) = 0 THEN CALL FireIt ELSE IF giAppRunning = 0 OR StopAction = 1 THEN EXIT SUB SLEEP 5 GOTO TryAgain END IF END SUB SUB FireIt LOCAL Eo AS LONG FOR Eo = 1 TO 10 'Fire command PROCESSIT(Eo) = 1 NEXT '? "fire command sent" END SUB SUB ZeroThreadCompletion LOCAL Eo AS LONG FOR Eo = 1 TO 10 'ResetFinished FINISHEDIT(Eo) = 0 NEXT '? "Reset Finish" END SUB THREAD FUNCTION FormatThreads01(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread01 = 1 WHILE giAppRunning = 1 IF PROCESSIT(1) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File01(Io) REPLACE "e" WITH "z" IN File01(Io) REPLACE "i" WITH "z" IN File01(Io) REPLACE "o" WITH "z" IN File01(Io) REPLACE "u" WITH "z" IN File01(Io) PROCESSIT(1) = 0 FINISHEDIT(1) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread01 = 0 END FUNCTION THREAD FUNCTION FormatThreads02(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread02 = 1 WHILE giAppRunning = 1 IF PROCESSIT(2) = 1 THEN 'FOR Io = StartPT + 251 TO StartPT + 500 INCR Io 'do something to the content REPLACE "a" WITH "z" IN File02(Io) REPLACE "e" WITH "z" IN File02(Io) REPLACE "i" WITH "z" IN File02(Io) REPLACE "o" WITH "z" IN File02(Io) REPLACE "u" WITH "z" IN File02(Io) PROCESSIT(2) = 0 FINISHEDIT(2) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread02 = 0 END FUNCTION THREAD FUNCTION FormatThreads03(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread03 = 1 WHILE giAppRunning = 1 IF PROCESSIT(3) = 1 THEN 'FOR Io = StartPT + 501 TO StartPT + 750 'do something to the content INCR Io REPLACE "a" WITH "z" IN File03(Io) REPLACE "e" WITH "z" IN File03(Io) REPLACE "i" WITH "z" IN File03(Io) REPLACE "o" WITH "z" IN File03(Io) REPLACE "u" WITH "z" IN File03(Io) PROCESSIT(3) = 0 FINISHEDIT(3) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread03 = 0 END FUNCTION THREAD FUNCTION FormatThreads04(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread04 = 1 WHILE giAppRunning = 1 IF PROCESSIT(4) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File04(Io) REPLACE "e" WITH "z" IN File04(Io) REPLACE "i" WITH "z" IN File04(Io) REPLACE "o" WITH "z" IN File04(Io) REPLACE "u" WITH "z" IN File04(Io) PROCESSIT(4) = 0 FINISHEDIT(4) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread04 = 0 END FUNCTION THREAD FUNCTION FormatThreads05(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread05 = 1 WHILE giAppRunning = 1 IF PROCESSIT(5) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File05(Io) REPLACE "e" WITH "z" IN File05(Io) REPLACE "i" WITH "z" IN File05(Io) REPLACE "o" WITH "z" IN File05(Io) REPLACE "u" WITH "z" IN File05(Io) PROCESSIT(5) = 0 FINISHEDIT(5) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread05 = 0 END FUNCTION THREAD FUNCTION FormatThreads06(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread06 = 1 WHILE giAppRunning = 1 IF PROCESSIT(6) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File06(Io) REPLACE "e" WITH "z" IN File06(Io) REPLACE "i" WITH "z" IN File06(Io) REPLACE "o" WITH "z" IN File06(Io) REPLACE "u" WITH "z" IN File06(Io) PROCESSIT(6) = 0 FINISHEDIT(6) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread06 = 0 END FUNCTION THREAD FUNCTION FormatThreads07(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread07 = 1 WHILE giAppRunning = 1 IF PROCESSIT(7) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File07(Io) REPLACE "e" WITH "z" IN File07(Io) REPLACE "i" WITH "z" IN File07(Io) REPLACE "o" WITH "z" IN File07(Io) REPLACE "u" WITH "z" IN File07(Io) PROCESSIT(7) = 0 FINISHEDIT(7) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread07 = 0 END FUNCTION THREAD FUNCTION FormatThreads08(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread08 = 1 WHILE giAppRunning = 1 IF PROCESSIT(8) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File08(Io) REPLACE "e" WITH "z" IN File08(Io) REPLACE "i" WITH "z" IN File08(Io) REPLACE "o" WITH "z" IN File08(Io) REPLACE "u" WITH "z" IN File08(Io) PROCESSIT(8) = 0 FINISHEDIT(8) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread08 = 0 END FUNCTION THREAD FUNCTION FormatThreads09(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread09 = 1 WHILE giAppRunning = 1 IF PROCESSIT(9) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File09(Io) REPLACE "e" WITH "z" IN File09(Io) REPLACE "i" WITH "z" IN File09(Io) REPLACE "o" WITH "z" IN File09(Io) REPLACE "u" WITH "z" IN File09(Io) PROCESSIT(9) = 0 FINISHEDIT(9) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread09 = 0 END FUNCTION THREAD FUNCTION FormatThreads10(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG giThread10 = 1 WHILE giAppRunning = 1 IF PROCESSIT(10) = 1 THEN INCR Io 'do something to the content REPLACE "a" WITH "z" IN File10(Io) REPLACE "e" WITH "z" IN File10(Io) REPLACE "i" WITH "z" IN File10(Io) REPLACE "o" WITH "z" IN File10(Io) REPLACE "u" WITH "z" IN File10(Io) PROCESSIT(10) = 0 FINISHEDIT(10) = 1 IF FINISHEDIT(1) = 1 AND _ FINISHEDIT(2) = 1 AND _ FINISHEDIT(3) = 1 AND _ FINISHEDIT(4) = 1 AND _ FINISHEDIT(5) = 1 AND _ FINISHEDIT(6) = 1 AND _ FINISHEDIT(7) = 1 AND _ FINISHEDIT(8) = 1 AND _ FINISHEDIT(9) = 1 AND _ FINISHEDIT(10) = 1 THEN CALL ZeroThreadCompletion PostMessage hDlg, %WM_COMMAND, %IDC_Next, 0 END IF END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThread10 = 0 END FUNCTION THREAD FUNCTION StoreThreads(BYVAL x AS LONG) AS LONG LOCAL Io AS LONG LOCAL i01 AS LONG LOCAL i02 AS LONG LOCAL i03 AS LONG LOCAL i04 AS LONG LOCAL i05 AS LONG LOCAL i06 AS LONG LOCAL i07 AS LONG LOCAL i08 AS LONG LOCAL i09 AS LONG LOCAL i10 AS LONG LOCAL Seq AS LONG giThreadStore = 1 WHILE giAppRunning = 1 IF StoreIt = 1 AND StopAction = 0 THEN StoreIt = 0 'remove formatted files on first run IF DIR$(EXE.PATH$ & "threads_formatted\*.HTM") <> "" AND giWipedFolder = 0 THEN KILL EXE.PATH$ & "threads_formatted\*.HTM" giWipedFolder = 1 END IF 'save results FOR Io = 1 TO UBOUND(File01()) INCR Seq i01 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i01 : PRINT #i01, File01(Io); : CLOSE #i01 File01(Io) = "" INCR Seq i02 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i02 : PRINT #i02, File02(Io); : CLOSE #i02 File02(Io) = "" INCR Seq i03 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i03 : PRINT #i03, File03(Io); : CLOSE #i03 File03(Io) = "" INCR Seq i04 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i04 : PRINT #i04, File04(Io); : CLOSE #i04 File04(Io) = "" INCR Seq i05 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i05 : PRINT #i05, File05(Io); : CLOSE #i05 File05(Io) = "" INCR Seq i06 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i06 : PRINT #i06, File06(Io); : CLOSE #i06 File06(Io) = "" INCR Seq i07 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i07 : PRINT #i07, File07(Io); : CLOSE #i07 File07(Io) = "" INCR Seq i08 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i08 : PRINT #i08, File08(Io); : CLOSE #i08 File08(Io) = "" INCR Seq i09 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i09 : PRINT #i09, File09(Io); : CLOSE #i09 File09(Io) = "" INCR Seq i10 = FREEFILE OPEN "threads_formatted\" + URLs(Seq) FOR OUTPUT AS #i10 : PRINT #i10, File10(Io); : CLOSE #i10 File10(Io) = "" NEXT Io Seq = 0 'last update PostMessage hDlg, %WM_COMMAND, %IDC_Finished, 0 END IF IF giAppRunning = 1 THEN SLEEP BreakTime WEND giThreadStore = 0 END FUNCTION
Comment