Borland C++ 5.02 中使用第 3 方头文件的多线程
Multi threading with 3rd party headerfiles in Borland C++ 5.02
有没有我可以用来在 Borland 5.02 上创建多线程的头文件或扩展?
我想制作一个程序,让两条直线以不同的速度移动,无限循环。
像这样
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include<dos.h>
void linesmov(int seconds);
main()
{
// Thread 1
linesmov(5);
//Thread 2
linesmov(30);
}
void linesmov(int mseconds){
int i=0;
while (true){
i=i+1;
clrscr(); // Or system("cls"); If you may...
gotoxy(i,15); cout << "____||____||____";
Sleep(mseconds);
if (i>115){ i=0; }
}
}
是的..我知道人们会说,买一个新的编译器,
我的学校使用旧编译器作为评分"standard",所以请耐心等待。
您的代码正在使用 windows.h
,这意味着您可以访问 Win32 API。所以看看 Win32 CreateThread()
函数。
所以我终于找到了一种方法。
#include <Windows.h>
#include <stdio.h>
#include<dos.h>
#include<iostream.h>
#include<conio.h>
void linesmov(int mseconds,int y);
void linesmov(int mseconds,int y){
int i=0;
while (true){
i=i+1;
// Or system("cls"); If you may...
gotoxy(i,y); cout << "____||____||____"; gotoxy(i-1,y);cout << " ";
Sleep(mseconds);
if (i>115){ i=0; for(int o=0;o<100;o++){gotoxy(0,y); cout << " ";}}
}
}
DWORD WINAPI mythread1(LPVOID lpParameter)
{
printf("Thread inside %d \n", GetCurrentThreadId());
linesmov(5,10);
return 0;
}
DWORD WINAPI mythread2(LPVOID lpParameter)
{
printf("Thread inside %d \n", GetCurrentThreadId());
linesmov(30,15);
return 0;
}
int main(int argc, char* argv[])
{
HANDLE myhandle1;
DWORD mythreadid1;
HANDLE myhandle2;
DWORD mythreadid2;
myhandle1 = CreateThread(0,0,mythread1,0,0,&mythreadid1);
myhandle2 = CreateThread(0,0,mythread2,0,0,&mythreadid2);
printf("Thread after %d \n", mythreadid1);
getchar();
return 0;
}
做得好!
Hans Boehm 写了一篇著名的论文来解释为什么这是个坏主意:Threads cannot be implemented as a library。
简而言之,如果你想进行 multi-threaded 编程,你需要一种语言和一个编译器来为 thread-safety 提供一定的保证。如果你没有这个,你最终会 运行 陷入非常奇怪和难以理解的错误。
顺便说一句,这是 C++11 引入的线程支持如此重要的主要原因之一:仅使用库是不够的,您实际上还需要语言的适当支持。
由于 Borland C++ 不提供这些保证,因此在使用它进行 multi-threaded 编程时不要指望它能带你走得很远。
有没有我可以用来在 Borland 5.02 上创建多线程的头文件或扩展?
我想制作一个程序,让两条直线以不同的速度移动,无限循环。 像这样
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include<dos.h>
void linesmov(int seconds);
main()
{
// Thread 1
linesmov(5);
//Thread 2
linesmov(30);
}
void linesmov(int mseconds){
int i=0;
while (true){
i=i+1;
clrscr(); // Or system("cls"); If you may...
gotoxy(i,15); cout << "____||____||____";
Sleep(mseconds);
if (i>115){ i=0; }
}
}
是的..我知道人们会说,买一个新的编译器, 我的学校使用旧编译器作为评分"standard",所以请耐心等待。
您的代码正在使用 windows.h
,这意味着您可以访问 Win32 API。所以看看 Win32 CreateThread()
函数。
所以我终于找到了一种方法。
#include <Windows.h>
#include <stdio.h>
#include<dos.h>
#include<iostream.h>
#include<conio.h>
void linesmov(int mseconds,int y);
void linesmov(int mseconds,int y){
int i=0;
while (true){
i=i+1;
// Or system("cls"); If you may...
gotoxy(i,y); cout << "____||____||____"; gotoxy(i-1,y);cout << " ";
Sleep(mseconds);
if (i>115){ i=0; for(int o=0;o<100;o++){gotoxy(0,y); cout << " ";}}
}
}
DWORD WINAPI mythread1(LPVOID lpParameter)
{
printf("Thread inside %d \n", GetCurrentThreadId());
linesmov(5,10);
return 0;
}
DWORD WINAPI mythread2(LPVOID lpParameter)
{
printf("Thread inside %d \n", GetCurrentThreadId());
linesmov(30,15);
return 0;
}
int main(int argc, char* argv[])
{
HANDLE myhandle1;
DWORD mythreadid1;
HANDLE myhandle2;
DWORD mythreadid2;
myhandle1 = CreateThread(0,0,mythread1,0,0,&mythreadid1);
myhandle2 = CreateThread(0,0,mythread2,0,0,&mythreadid2);
printf("Thread after %d \n", mythreadid1);
getchar();
return 0;
}
做得好!
Hans Boehm 写了一篇著名的论文来解释为什么这是个坏主意:Threads cannot be implemented as a library。
简而言之,如果你想进行 multi-threaded 编程,你需要一种语言和一个编译器来为 thread-safety 提供一定的保证。如果你没有这个,你最终会 运行 陷入非常奇怪和难以理解的错误。
顺便说一句,这是 C++11 引入的线程支持如此重要的主要原因之一:仅使用库是不够的,您实际上还需要语言的适当支持。
由于 Borland C++ 不提供这些保证,因此在使用它进行 multi-threaded 编程时不要指望它能带你走得很远。