Помогите найти ошибку в программке
От: Oleg_SK  
Дата: 17.04.04 20:37
Оценка:
Вопрос по критическим секциям, организованным нестандартным методом. Я на досуге, набросал немного кода, чтобы протестировать этот метод. Но, эта программка не захотела нормально работать. Вместо того, чтобы выводить сообщения от потоков по очереди (в любом порядке), она их выводит одновременно(кроме первого)... В чем трабла? У меня такое впечетление, что API-функция: WaitForSingleObject, в данном случае, почему то не срабатывает... Покажите, пожалуйста, где я ошибся. Вот исходник программки (MASM32+Win32 API):

.686
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive

include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib

ThreadProc_2 PROTO :DWORD
ThreadProc_3 PROTO :DWORD

.data
Header_1 db 'Thread 1',0
Text_1 db 'Hello!!!',0
Header_2 db 'Thread 2',0
Text_2 db 'Hello!!!',0
Header_3 db 'Thread 3',0
Text_3 db 'Hello!!!',0

.data?
hThread_2 DWORD ?
hThread_3 DWORD ?
HTHR_2 DWORD ?
HTHR_3 DWORD ?
hEvent DWORD ?
Flag DWORD ?; 0 — nonsignaled, 1 — signaled.

.code
Start:
push ebx
invoke CreateEvent, NULL, FALSE, TRUE, NULL
cmp eax, NULL
je Finish
mov [hEvent], eax
invoke CreateThread, NULL, NULL, addr [ThreadProc_2], NULL, NULL, addr [HTHR_2]
mov [hThread_2], eax
invoke CreateThread, NULL, NULL, addr [ThreadProc_3], NULL, NULL, addr [HTHR_3]
mov [hThread_3], eax
mov [Flag], 1
mov ebx, 5
Loop_1:
push ebx
xor eax, eax
xchg eax, [Flag]
test eax, eax
jnz Go
invoke WaitForSingleObject, [hEvent], INFINITE
cmp eax, WAIT_FAILED
je Finish
Go:
invoke MessageBox, 0, addr [Text_1], addr [Header_1], MB_OK
mov [Flag], 1
invoke SetEvent, [hEvent]
pop ebx
dec ebx
jnz Loop_1
Finish:
invoke Beep, 1500, 50
invoke WaitForMultipleObjects, 2, addr [hThread_2], TRUE, INFINITE
pop ebx
invoke ExitProcess, 0


ThreadProc_2 proc Parm_1:DWORD
push ebx
mov ebx, 5
Loop_2:
push ebx
xor eax, eax
xchg eax, [Flag]
test eax, eax
jnz Go2
invoke WaitForSingleObject, [hEvent], INFINITE
cmp eax, WAIT_FAILED
je Finish_2
Go2:
invoke MessageBox, 0, addr [Text_2], addr [Header_2], MB_OK
mov [Flag], 1
invoke SetEvent, [hEvent]
pop ebx
dec ebx
jnz Loop_2
Finish_2:
invoke Beep, 1500, 50
pop ebx
ret 4
ThreadProc_2 endp

ThreadProc_3 proc Parm_1:DWORD
push ebx
mov ebx, 5
Loop_3:
push ebx
xor eax, eax
xchg eax, [Flag]
test eax, eax
jnz Go3
invoke WaitForSingleObject, [hEvent], INFINITE
cmp eax, WAIT_FAILED
je Finish_3
Go3:
invoke MessageBox, 0, addr [Text_3], addr [Header_3], MB_OK
mov [Flag], 1
invoke SetEvent, [hEvent]
pop ebx
dec ebx
jnz Loop_3
Finish_3:
invoke Beep, 1500, 50
pop ebx
ret 4
ThreadProc_3 endp
end Start

P.S.: Я тестил эту программку под Windows 2000 Pro (SP3) Russian.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.