View Single Post
Old 02-18-2006, 03:51 PM   #1 (permalink)
Hamlin
Jedi Master
 
Hamlin's Avatar
 
Join Date: Feb 2006
Location: Denver, CO
Posts: 15
Hamlin is on a distinguished road
Multithreaded application in Windows XP

I'm trying to get five threads to operate concurrently under windows XP. Currently the first thread activates properly, but the second crashes, and I don't know why. If you do, *please* let me know.

P.S. I know the code is inefficient - I'm just trying to prove to myself that it can be done before I build optimizing procedures.

Code:
.386
.model flat, stdcall
include	kernel32.inc
include	gdi32.inc
include user32.inc
include windows.inc
include	igaserver.inc
includelib	kernel32.lib
includelib	user32.lib
includelib	gdi32.lib

.data

maintname	db	'Iga Server Main Terminal', 0
peopletname	db	'People', 0
tgrouptname	db	'Task Groups', 0
woodtname	db	'Wood Cutters', 0
farmtname	db	'Farmers', 0
smithtname	db	'Blacksmiths', 0
hunttname	db	'Hunters', 0
maincname	db	'IGASERVER', 0
peoplecname	db	'IGAPEOPLE', 0
tgroupcname	db	'IGATGROUP', 0
woodcname	db	'IGAWOOD', 0
farmcname	db	'IGAFARM', 0
smithcname	db	'IGASMITH', 0
huntcname	db	'IGAHUNT', 0

.data?

fperson		person <?>
fvillage	village <?>
mainmsg		MSG	<?>
peoplemsg	MSG <?>
tgroupmsg	MSG <?>
woodmsg		MSG <?>
farmmsg		MSG <?>
smithmsg	MSG	<?>
huntmsg		MSG <?>
mainwc		WNDCLASS <?>
peoplewc	WNDCLASS <?>
tgroupwc	WNDCLASS <?>
woodwc		WNDCLASS <?>
farmwc		WNDCLASS <?>
smithwc		WNDCLASS <?>
huntwc		WNDCLASS <?>
mainhinst	dd	?
peoplehinst	dd	?
tgrouphinst	dd	?
woodhinst	dd	?
farmhinst	dd	?
smithhinst	dd	?
hunthinst	dd	?
mainhwnd	dd	?
peoplehwnd	dd	?
tgrouphwnd	dd	?
woodhwnd	dd	?
farmhwnd	dd	?
smithhwnd	dd	?
hunthwnd	dd	?
mainthr		dd	?
peoplethr	dd	?
tgroupthr	dd	?
woodthr		dd	?
farmthr		dd	?
smiththr	dd	?
huntthr		dd	?

.code

start:

	;	Start main thread

	push	0
	push	1000
	push	offset main_thread
	push	0
	push	0
	push	dword ptr [mainthr]
	call	CreateThread
	
	;	Start people thread
	
	push	0
	push	1000
	push	offset people_thread
	push	0
	push	0
	push	dword ptr [peoplethr]
	call	CreateThread
		
	;	Start task group thread
	
	push	0
	push	1000
	push	offset tgroup_thread
	push	0
	push	0
	push	dword ptr [tgroupthr]
	call	CreateThread
		
	;	Start wood cutter thread
	
	push	0
	push	1000
	push	offset wood_thread
	push	0
	push	0
	push	dword ptr [woodthr]
	call	CreateThread
		
	;	Start farmer thread
	
	push	0
	push	1000
	push	offset farm_thread
	push	0
	push	0
	push	dword ptr [farmthr]
	call	CreateThread
		
	;	Start blacksmith thread
	
	push	0
	push	1000
	push	offset smith_thread
	push	0
	push	0
	push	dword ptr [smiththr]
	call	CreateThread
	
	;	Start hunter thread
	
	push	0
	push	1000
	push	offset hunt_thread
	push	0
	push	0
	push	dword ptr [huntthr]
	call	CreateThread
		
main_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [mainhinst], eax

main_thread_reg_class:

	mov		dword ptr [mainwc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [mainwc.lpfnWndProc], offset main_thread_wndproc
	mov		dword ptr [mainwc.cbClsExtra], 0
	mov		dword ptr [mainwc.cbWndExtra], 0
	mov		eax, dword ptr [mainhinst]
	mov		dword ptr [mainwc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [mainwc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [mainwc.hCursor], eax
	mov		dword ptr [mainwc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [mainwc.lpszMenuName], 0
	mov		dword ptr [mainwc.lpszClassName], offset maincname
	push	offset mainwc
	call	RegisterClass
	push	0
	push	dword ptr [mainhinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset maintname
	push	offset maincname
	push	0
	call	CreateWindowEx
	mov		dword ptr [mainhwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [mainhwnd]
	call	ShowWindow
	push	dword ptr [mainhwnd]
	call	UpdateWindow
	
main_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset mainmsg
	call	GetMessage
	cmp		eax, 0
	jz		main_thread_end_loop
	
	push	offset mainmsg
	call	TranslateMessage
	push	offset mainmsg
	call	DispatchMessage
	jmp		main_thread_msg_loop
	
main_thread_end_loop:

	push	dword ptr [mainmsg.wParam]
	call	ExitThread
	
main_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		main_thread_wndproc_wmdestroy
	
	jmp		main_thread_wndproc_defwndproc
	
main_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		main_thread_wndproc_finish
	
main_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

main_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
people_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [peoplehinst], eax

people_thread_reg_class:

	mov		dword ptr [peoplewc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [peoplewc.lpfnWndProc], offset people_thread_wndproc
	mov		dword ptr [peoplewc.cbClsExtra], 0
	mov		dword ptr [peoplewc.cbWndExtra], 0
	mov		eax, dword ptr [peoplehinst]
	mov		dword ptr [peoplewc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [peoplewc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [peoplewc.hCursor], eax
	mov		dword ptr [peoplewc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [peoplewc.lpszMenuName], 0
	mov		dword ptr [peoplewc.lpszClassName], offset peoplecname
	push	offset peoplewc
	call	RegisterClass
	push	0
	push	dword ptr [peoplehinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset peopletname
	push	offset peoplecname
	push	0
	call	CreateWindowEx
	mov		dword ptr [peoplehwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [peoplehwnd]
	call	ShowWindow
	push	dword ptr [peoplehwnd]
	call	UpdateWindow
	
people_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset peoplemsg
	call	GetMessage
	cmp		eax, 0
	jz		people_thread_end_loop
	
	push	offset peoplemsg
	call	TranslateMessage
	push	offset peoplemsg
	call	DispatchMessage
	jmp		people_thread_msg_loop
	
people_thread_end_loop:

	push	dword ptr [peoplemsg.wParam]
	call	ExitThread
	
people_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		people_thread_wndproc_wmdestroy
	
	jmp		people_thread_wndproc_defwndproc
	
people_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		people_thread_wndproc_finish
	
people_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

people_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
tgroup_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [tgrouphinst], eax

tgroup_thread_reg_class:

	mov		dword ptr [tgroupwc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [tgroupwc.lpfnWndProc], offset tgroup_thread_wndproc
	mov		dword ptr [tgroupwc.cbClsExtra], 0
	mov		dword ptr [tgroupwc.cbWndExtra], 0
	mov		eax, dword ptr [tgrouphinst]
	mov		dword ptr [tgroupwc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [tgroupwc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [tgroupwc.hCursor], eax
	mov		dword ptr [tgroupwc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [tgroupwc.lpszMenuName], 0
	mov		dword ptr [tgroupwc.lpszClassName], offset tgroupcname
	push	offset tgroupwc
	call	RegisterClass
	push	0
	push	dword ptr [tgrouphinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset tgrouptname
	push	offset tgroupcname
	push	0
	call	CreateWindowEx
	mov		dword ptr [tgrouphwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [tgrouphwnd]
	call	ShowWindow
	push	dword ptr [tgrouphwnd]
	call	UpdateWindow
	
tgroup_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset tgroupmsg
	call	GetMessage
	cmp		eax, 0
	jz		tgroup_thread_end_loop
	
	push	offset tgroupmsg
	call	TranslateMessage
	push	offset tgroupmsg
	call	DispatchMessage
	jmp		tgroup_thread_msg_loop
	
tgroup_thread_end_loop:

	push	dword ptr [tgroupmsg.wParam]
	call	ExitThread
	
tgroup_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		tgroup_thread_wndproc_wmdestroy
	
	jmp		tgroup_thread_wndproc_defwndproc
	
tgroup_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		tgroup_thread_wndproc_finish
	
tgroup_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

tgroup_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
wood_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [woodhinst], eax

wood_thread_reg_class:

	mov		dword ptr [woodwc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [woodwc.lpfnWndProc], offset wood_thread_wndproc
	mov		dword ptr [woodwc.cbClsExtra], 0
	mov		dword ptr [woodwc.cbWndExtra], 0
	mov		eax, dword ptr [woodhinst]
	mov		dword ptr [woodwc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [woodwc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [woodwc.hCursor], eax
	mov		dword ptr [woodwc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [woodwc.lpszMenuName], 0
	mov		dword ptr [woodwc.lpszClassName], offset woodcname
	push	offset woodwc
	call	RegisterClass
	push	0
	push	dword ptr [woodhinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset woodtname
	push	offset woodcname
	push	0
	call	CreateWindowEx
	mov		dword ptr [woodhwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [woodhwnd]
	call	ShowWindow
	push	dword ptr [woodhwnd]
	call	UpdateWindow
	
wood_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset woodmsg
	call	GetMessage
	cmp		eax, 0
	jz		wood_thread_end_loop
	
	push	offset woodmsg
	call	TranslateMessage
	push	offset woodmsg
	call	DispatchMessage
	jmp		wood_thread_msg_loop
	
wood_thread_end_loop:

	push	dword ptr [woodmsg.wParam]
	call	ExitThread
	
wood_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		wood_thread_wndproc_wmdestroy
	
	jmp		wood_thread_wndproc_defwndproc
	
wood_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		wood_thread_wndproc_finish
	
wood_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

wood_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
farm_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [farmhinst], eax

farm_thread_reg_class:

	mov		dword ptr [farmwc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [farmwc.lpfnWndProc], offset farm_thread_wndproc
	mov		dword ptr [farmwc.cbClsExtra], 0
	mov		dword ptr [farmwc.cbWndExtra], 0
	mov		eax, dword ptr [farmhinst]
	mov		dword ptr [farmwc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [farmwc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [farmwc.hCursor], eax
	mov		dword ptr [farmwc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [farmwc.lpszMenuName], 0
	mov		dword ptr [farmwc.lpszClassName], offset farmcname
	push	offset farmwc
	call	RegisterClass
	push	0
	push	dword ptr [farmhinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset farmtname
	push	offset farmcname
	push	0
	call	CreateWindowEx
	mov		dword ptr [farmhwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [farmhwnd]
	call	ShowWindow
	push	dword ptr [farmhwnd]
	call	UpdateWindow
	
farm_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset farmmsg
	call	GetMessage
	cmp		eax, 0
	jz		farm_thread_end_loop
	
	push	offset farmmsg
	call	TranslateMessage
	push	offset farmmsg
	call	DispatchMessage
	jmp		farm_thread_msg_loop
	
farm_thread_end_loop:

	push	dword ptr [farmmsg.wParam]
	call	ExitThread
	
farm_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		farm_thread_wndproc_wmdestroy
	
	jmp		farm_thread_wndproc_defwndproc
	
farm_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		farm_thread_wndproc_finish
	
farm_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

farm_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
smith_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [smithhinst], eax

smith_thread_reg_class:

	mov		dword ptr [smithwc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [smithwc.lpfnWndProc], offset smith_thread_wndproc
	mov		dword ptr [smithwc.cbClsExtra], 0
	mov		dword ptr [smithwc.cbWndExtra], 0
	mov		eax, dword ptr [smithhinst]
	mov		dword ptr [smithwc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [smithwc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [smithwc.hCursor], eax
	mov		dword ptr [smithwc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [smithwc.lpszMenuName], 0
	mov		dword ptr [smithwc.lpszClassName], offset smithcname
	push	offset smithwc
	call	RegisterClass
	push	0
	push	dword ptr [smithhinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset smithtname
	push	offset smithcname
	push	0
	call	CreateWindowEx
	mov		dword ptr [smithhwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [smithhwnd]

	call	ShowWindow
	push	dword ptr [smithhwnd]
	call	UpdateWindow
	
smith_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset smithmsg
	call	GetMessage
	cmp		eax, 0
	jz		smith_thread_end_loop
	
	push	offset smithmsg
	call	TranslateMessage
	push	offset smithmsg
	call	DispatchMessage
	jmp		smith_thread_msg_loop
	
smith_thread_end_loop:

	push	dword ptr [smithmsg.wParam]
	call	ExitThread
	
smith_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		smith_thread_wndproc_wmdestroy
	
	jmp		smith_thread_wndproc_defwndproc
	
smith_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		smith_thread_wndproc_finish
	
smith_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

smith_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
hunt_thread:

	push	0
	call	GetModuleHandle
	mov		dword ptr [hunthinst], eax

hunt_thread_reg_class:

	mov		dword ptr [huntwc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
	mov		dword ptr [huntwc.lpfnWndProc], offset hunt_thread_wndproc
	mov		dword ptr [huntwc.cbClsExtra], 0
	mov		dword ptr [huntwc.cbWndExtra], 0
	mov		eax, dword ptr [hunthinst]
	mov		dword ptr [huntwc.hInstance], eax
	push	IDI_APPLICATION
	push	0
	call	LoadIcon
	mov		dword ptr [huntwc.hIcon], eax
	push	IDC_CROSS
	push	0
	call	LoadCursor
	mov		dword ptr [huntwc.hCursor], eax
	mov		dword ptr [huntwc.hbrBackground], COLOR_WINDOW+1
	mov		dword ptr [huntwc.lpszMenuName], 0
	mov		dword ptr [huntwc.lpszClassName], offset huntcname
	push	offset huntwc
	call	RegisterClass
	push	0
	push	dword ptr [hunthinst]
	push	0
	push	0
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	CW_USEDEFAULT
	push	WS_OVERLAPPEDWINDOW
	push	offset hunttname
	push	offset huntcname
	push	0
	call	CreateWindowEx
	mov		dword ptr [hunthwnd], eax
	push	SW_SHOWNORMAL
	push	dword ptr [hunthwnd]
	call	ShowWindow
	push	dword ptr [hunthwnd]
	call	UpdateWindow
	
hunt_thread_msg_loop:

	push	0
	push	0
	push	0
	push	offset huntmsg
	call	GetMessage
	cmp		eax, 0
	jz		hunt_thread_end_loop
	
	push	offset huntmsg
	call	TranslateMessage
	push	offset huntmsg
	call	DispatchMessage
	jmp		hunt_thread_msg_loop
	
hunt_thread_end_loop:

	push	dword ptr [huntmsg.wParam]
	call	ExitThread
	
hunt_thread_wndproc:

	push	ebp
	mov		ebp, esp
	push	ebx
	push	esi
	push	edi
	cmp		dword ptr [ebp+0Ch], WM_DESTROY
	jz		hunt_thread_wndproc_wmdestroy
	
	jmp		hunt_thread_wndproc_defwndproc
	
hunt_thread_wndproc_wmdestroy:

	push	0
	call	PostQuitMessage
	sub		eax, eax
	jmp		hunt_thread_wndproc_finish
	
hunt_thread_wndproc_defwndproc:

	push	dword ptr [ebp+14h]
	push	dword ptr [ebp+10h]
	push	dword ptr [ebp+0Ch]
	push	dword ptr [ebp+08h]
	call	DefWindowProc

hunt_thread_wndproc_finish:
	
	pop		edi
	pop		esi
	pop		ebx
	pop		ebp
	ret		16
	
end	start
Hamlin is offline   Reply With Quote