#include <windows.h>
#include <stdio.h>HANDLE g_hEvent = NULL;DWORD WINAPI Thread1Proc(
LPVOID lpParameter // thread data
)
{
printf("Enter Thread1\r\n");
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread1\r\n");
return 0;
}DWORD WINAPI Thread2Proc(
LPVOID lpParameter // thread data
)
{
printf("Enter Thread2\r\n");
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread2\r\n");
return 0;
}void main()
{
HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL ); g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
Sleep( 3000 );
SetEvent( g_hEvent );
Sleep( 3000 );
CloseHandle( hThread1 );
CloseHandle( hThread2 );
CloseHandle( g_hEvent );
}我写了上面的代码,目的是想测试同一个人工重置的事件被两个线程等待到后的结果。但是发现输入的字符串不稳定,一会输出这个,一会又输出那个,到底是什么原因。
#include <stdio.h>HANDLE g_hEvent = NULL;DWORD WINAPI Thread1Proc(
LPVOID lpParameter // thread data
)
{
printf("Enter Thread1\r\n");
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread1\r\n");
return 0;
}DWORD WINAPI Thread2Proc(
LPVOID lpParameter // thread data
)
{
printf("Enter Thread2\r\n");
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread2\r\n");
return 0;
}void main()
{
HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL ); g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
Sleep( 3000 );
SetEvent( g_hEvent );
Sleep( 3000 );
CloseHandle( hThread1 );
CloseHandle( hThread2 );
CloseHandle( g_hEvent );
}我写了上面的代码,目的是想测试同一个人工重置的事件被两个线程等待到后的结果。但是发现输入的字符串不稳定,一会输出这个,一会又输出那个,到底是什么原因。
解决方案 »
- 编辑框的这种效果是怎样实现?
- 禁止CListCtrl 标题栏中的右边拖动
- USB程序编译怎么过不去啊?大家救救,!!!!1
- 请教:为什么工具栏停靠时,垂直停靠优先于水平的,怎么解决?
- vc6中用ODBC连接SQL SERVER数据库后,怎么deciaml类型到Recordset中变为CString类型,我该怎么给它付值呢?用double还是CString?
- 如何在父窗口中处理子窗口的子窗口发送的通知消息
- 发布ActiveX控件疑惑的三个问题。
- 一个文件类型的问题, .VIP用什么方式打开???
- CSring 可以多长,,为什么只有怎么点长
- 请问怎样在程序里控制一Cbutton控件的显示与否?
- CListCtrl的EDIT BOX怎么改字体颜色啊,折腾了我半天,准备放弃了
- ftp断点续传
#include <windows.h>
#include <stdio.h>HANDLE g_hEvent = NULL;
int g_nThread1 = 0;
int g_nThread2 = 0;DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
g_nThread1++;
printf("Enter Thread1\r\n");
printf("g_nThread1 = %d\n", g_nThread1);
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000); printf("Leave Thread1\r\n");
return 0;
}DWORD WINAPI Thread2Proc( LPVOID lpParameter)
{
g_nThread2++;
printf("Enter Thread2\r\n");
printf("g_nThread2 = %d\n", g_nThread2);
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread2\r\n");
return 0;
}void main()
{
HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL );
g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
Sleep( 3000 );
SetEvent( g_hEvent );
Sleep( 3000 );
CloseHandle( hThread1 );
CloseHandle( hThread2 );
CloseHandle( g_hEvent );
}
另外,VC6需要在项目设置的编译选项中指定多线程运行库,因为单线程运行库运行于多线程时有bug。
#include <windows.h>
#include <stdio.h>HANDLE g_hEvent = NULL;DWORD WINAPI Thread1Proc(
LPVOID lpParameter // thread data
)
{
WaitForSingleObject( g_hEvent, INFINITE );
printf("Enter Thread1\r\n");//里面
Sleep(10);
printf("Leave Thread1\r\n");
return 0;
}DWORD WINAPI Thread2Proc(
LPVOID lpParameter // thread data
)
{
WaitForSingleObject( g_hEvent, INFINITE );
printf("Enter Thread2\r\n");//放在里面
Sleep(10);
printf("Leave Thread2\r\n");
return 0;
}void main()
{
HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL ); g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
Sleep( 3000 );
SetEvent( g_hEvent );
Sleep( 3000 );
CloseHandle( hThread1 );
CloseHandle( hThread2 );
CloseHandle( g_hEvent );
}
细节问题;楼主好好想想;
两个原因:在 选项 - C / C++ CODE 处要设置多线程,再就是创建线程前应该先创建事件。真是奇怪,为什么啥问题原因你都知道?晕。