vc6上编写了个最简单的Win32 Console Application类型的多线程代码如下:(在VC2003上我把#include<iostream.h> 这句改为红色代码,其他完全一样)#include <Windows.h>
#include<iostream.h> #include<iostream> //VC2003
using namespace std; //VC2003
DWORD WINAPI Fun1Proc( LPVOID lpParameter );
void main()
{
HANDLE hThead1;
hThead1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThead1);
cout<<"main thread is running"<<endl;
Sleep(10);
}
DWORD WINAPI Fun1Proc( LPVOID lpParameter )
{
cout<<"thread1 is running now"<<endl;
return 0;
}VC6上的输出结果为:
main thread is running
thread1 is running nowVC2003上输出为:
mainthread1 is runni thread is runningng now现在的问题是:2003上输出后不但单词篡位了,而且字符位置都乱了!我想知道这个是不是和我替换的红色代码有关呢?为什么呢?请大家指点!
#include<iostream.h> #include<iostream> //VC2003
using namespace std; //VC2003
DWORD WINAPI Fun1Proc( LPVOID lpParameter );
void main()
{
HANDLE hThead1;
hThead1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThead1);
cout<<"main thread is running"<<endl;
Sleep(10);
}
DWORD WINAPI Fun1Proc( LPVOID lpParameter )
{
cout<<"thread1 is running now"<<endl;
return 0;
}VC6上的输出结果为:
main thread is running
thread1 is running nowVC2003上输出为:
mainthread1 is runni thread is runningng now现在的问题是:2003上输出后不但单词篡位了,而且字符位置都乱了!我想知道这个是不是和我替换的红色代码有关呢?为什么呢?请大家指点!
解决方案 »
- PreCreateWindow如何禁用窗口最大化
- MFC ADO操作数据库问题
- ?视频采集什么方法好啊?VFW作视频采集,是不是只是针对不带采集卡的摄像头的阿? 如果配有专门的采集卡 是不是不能使用VFW?
- 财鸟提问:如何在MDI中动态增加菜单呢?
- 请教高手:登陆对话框控件不能初始化的原因,急,多谢!顶者有分!
- 那种对给定IP段进行共享资源扫描的软件是怎么实现的?
- arvid_gs(west)请进来。谢谢你!!!!^_^这是另外一贴。
- 招聘ASP,VB程序员
- 平常经常看到由new得到一个对象,比如:pOneObject = new COneClass;而很少看到COneClass OneObject;为什么?
- vc有着项功能么?
- 关于从网页中提取特定链接并保存到TXT文件中的问题
- 学习WINDOWS汇编遇到的几个问题???
正好体现了多线程的并发。
Sleep(10);
cout < <"main thread is running" < <endl; 这样就不会出问题了.
main thread is running
main thread is running
thread1 is running now
这是怎么回事?
#include <iostream.h> #include <iostream> //VC2003
using namespace std; //VC2003
DWORD WINAPI Fun1Proc( LPVOID lpParameter );
void main()
{
HANDLE hThead1;
hThead1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThead1);
Sleep(10);
cout < <"main thread is running" < <endl;
}
DWORD WINAPI Fun1Proc( LPVOID lpParameter )
{
cout < <"thread1 is running now" < <endl;
return 0;
} VC6上的输出结果为(正确):
main thread is running
thread1 is running now VC2003上输出为(正确):
main thread is running
thread1 is running now
CRITICAL_SECTION CriticalSection; void main()
{
... // Initialize the critical section one time only.
if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
0x80000400) )
return;
... // Release resources used by the critical section object.
DeleteCriticalSection(&CriticalSection)
}DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
... // Request ownership of the critical section.
EnterCriticalSection(&CriticalSection); // Access the shared resource. // Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection); ...
}
"不sleep 新线程就不执行" 这句话我没有表达清楚,应该是: 不调用sleep时,主线程的入口函数main中,当调用第2行代码创建线程后,就会接着执行下一行代码,即调用CloseHandle函数关闭线程句柄,之后就执行第4行代码,输出一句话,然后该函数就退出了,也就是说主线程执行完成了,当主线程执行完毕后,进程也就退出了,这时进程中所有的资源,包括还没有执行的新线程都要退出,也就是说新线程还没有机会执行就退出了,新线程就不知行了! 因为sleep(10)是让主线程暂停运行10ms,使其放弃执行的权利,操作系统就会选择下来的新线程让其运行,当该线程运行完成后,或者10ms间隔时间已过,主线程就会恢复运行,main函数退出,进程结束了!
出现楼主说的内容被截断的原因只有一个:线程自身强行终止了输出过程。文本流已经全部进入管道中排队,接着线程退出,在控制台窗口还未处理完文本流上屏时收到线程终止信号,所以强行终止了实际上屏过程,未及处理的内容全部丢弃,接着处理队列中其他线程的输出内容。