1 /**
2 * Test case for PostThreadMessage
3 * (C) 2003 ReactOS
4 * License: LGPL
5 * See: LGPL.txt in top directory.
6 * Author: arty
7 *
8 * Windows thread message queue test case.
9 * Derived from ../event/event.c in part.
10 */
11
12 #include <windows.h>
13 #include <stdio.h>
14 #include <assert.h>
15
16 HANDLE hWaitForFailure;
17 HANDLE hOkToPostThreadMessage;
18 HANDLE hOkToTerminate;
19
thread(LPVOID crap)20 DWORD WINAPI thread( LPVOID crap )
21 {
22 MSG msg;
23
24 /* Failure case ... Wait for the parent to try to post a message
25 before queue creation */
26 printf( "Waiting to create the message queue.\n" );
27
28 WaitForSingleObject(hWaitForFailure,INFINITE);
29
30 printf( "Creating message queue.\n" );
31
32 /* "Create" a message queue */
33 PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE );
34
35 printf( "Signalling the parent that we're ready.\n" );
36
37 /* Signal that it's ok to post */
38 SetEvent( hOkToPostThreadMessage );
39
40 printf( "Listening messages.\n" );
41
42 /* Now read some messages */
43 while( GetMessage( &msg, 0,0,0 ) ) {
44 printf( "Received message: %04x %04x %08lx\n",
45 (msg.message & 0xffff),
46 (msg.wParam & 0xffff),
47 msg.lParam );
48 assert( !msg.hwnd );
49 }
50
51 printf( "Finished receiving messages.\n" );
52 SetEvent( hOkToTerminate );
53
54 return 0;
55 }
56
main(int argc,char ** argv)57 int main( int argc, char **argv )
58 {
59 DWORD id;
60
61 printf( "Creating events\n" );
62
63 hOkToPostThreadMessage = CreateEvent( NULL, FALSE, FALSE, NULL );
64 hOkToTerminate = CreateEvent( NULL, FALSE, FALSE, NULL );
65 hWaitForFailure = CreateEvent( NULL, FALSE, FALSE, NULL );
66
67 printf( "Created events\n" );
68
69 if( CreateThread( 0, 0, thread, 0, 0, &id ) == NULL ) {
70 printf( "Couldn't create one thread.\n" );
71 return 0;
72 }
73
74 printf( "Posting to non-existent queue\n" );
75
76 /* Check failure case */
77 assert( PostThreadMessage( id, WM_USER + 0, 1, 2 ) == FALSE );
78
79 printf( "Signalling thread to advance.\n" );
80
81 SetEvent( hWaitForFailure );
82
83 printf( "Waiting for signal from thread.\n" );
84 WaitForSingleObject( hOkToPostThreadMessage, INFINITE );
85
86 printf( "Sending three messages, then quit.\n" );
87 assert( PostThreadMessage( id, WM_USER + 0, 1, 2 ) );
88 assert( PostThreadMessage( id, WM_USER + 1, 3, 4 ) );
89 Sleep( 500 ); /* Sleep a bit, so that the queue is empty for a bit. */
90 assert( PostThreadMessage( id, WM_USER + 2, 5, 6 ) );
91 assert( PostThreadMessage( id, WM_QUIT, 0,0 ) );
92
93 WaitForSingleObject( hOkToTerminate, INFINITE );
94 printf( "Test complete.\n" );
95
96 return 0;
97 }
98