Well, I guess that settles it. (FINALLY!)
PB calls Exit Process. Windows obeys and terminates all threads of owning process. End.
Announcement
Collapse
No announcement yet.
Do threads do anything if main thread ends first?
Collapse
X
-
Guest repliedexitprocess
These are the last two lines executed in every PBMAIN/WINMAIN (applies to pb9 - previous versions not tested, but should be the same)
call ds:CoUninitialize
call ds:ExitProcess
Exiting PBMAIN/WINMAIN terminates the owning process and all its threads.
Guenther
Leave a comment:
-
-
I'm incorporating a routine waiting for any file change into a thread.
It will have to be signalled to complete, geez thanks for the extra work.
Leave a comment:
-
Any memory leak will clear itself up eventually, but for sure it is poor form.
But you can get your program to wait for your worker thread to complete easily enough (WaitForSingleObject on the thread handle)
Leave a comment:
-
I've tried to get threads to do something after main thread completes without success so everything you have said makes sense. I'm still curious if this can cause a memory leak or just isn't good form.
Leave a comment:
-
I have often wondered about this myself.
From Doc:
Platform SDK: DLLs, Processes, and Threads
Terminating a Thread
A thread executes until one of the following events occurs:
The thread calls the ExitThread function.
Any thread of the process calls the ExitProcess function.
The thread function returns.
Any thread calls the TerminateThread function with a handle to the thread.
Any thread calls the TerminateProcess function with a handle to the process.
However, PB imports "ExitProcess" even when I don't call it.... so I can only assume that PB is calling ExitProcess() when it reaches the end of WinMain(). (Why import it if you ain't gonna use it?)
I wrote this:
Code:'ORPHANTHREAD.BAS ' What happens when WinMain ends but a thread fucntion is executing? ' does the thread function end? ' PB/CC 5.0 #COMPILE EXE #DIM ALL FUNCTION PBMAIN () AS LONG LOCAL hThread AS LONG, Z AS LONG THREAD CREATE Worker (0) TO hThread FOR Z = 1 TO 4 SLEEP 1000 NEXT STDOUT "Reached end of WinMain" END FUNCTION FUNCTION Worker (BYVAL parm AS LONG) AS LONG LOCAL Z AS LONG, h AS LONG h = FREEFILE OPEN "Orphan.txt" FOR OUTPUT AS h FOR Z =1 TO 10 STDOUT USING$ ("Z #", Z) PRINT #h, USING$("& Z #", TIME$, Z) SLEEP 1000 NEXT CLOSE h END FUNCTION
Best guess is PB calls ExitProcess at end of WinMain... but you'd have to get that confirmed by PB.
Frankly, I think they probably have to do that... or the program ends up at the end of its executable code and has nothing to do... I'd think it probably would generate some type of protection fault in that case.
MCM
Leave a comment:
-
Do threads do anything if main thread ends first?
If MyThread is still executing while PBMAIN is ending, does MyThread do anything?
Is it bad form to not wait for all threads to complete?
Code:#include "win32api.inc" FUNCTION PBMAIN () AS LONG THREAD CREATE MyThread(x???) TO h??? SLEEP 50 IF h??? = 0 THEN ? "Error creating thread":EXIT FUNCTION REM WaitForSingleObject h???, %INFINITE REM DO:SLEEP 250:LOOP WHILE THREADCOUNT > 1 THREAD CLOSE h??? TO result??? 'required END FUNCTION THREAD FUNCTION MyThread(BYVAL x???) AS DWORD SLEEP 1000 'Does this do anything? BEEP 'NO BEEP SLEEP 1000 END FUNCTION
Last edited by Mike Doty; 2 Dec 2008, 12:43 PM.Tags: None
Leave a comment: