【发布时间】:2018-03-20 09:11:36
【问题描述】:
所以我使用 C++ Console 制作了一个应用程序,具有如下多线程,然后我收到错误 0x0000005。
第一次运行时它像往常一样工作。谁能帮我解决这个问题?
我正在将 Code::Blocks IDE 与 Borland C++ 5.5 一起使用,并且我计划将其变成 Borland C++ 5.02
#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;
}
【问题讨论】:
-
我无法使用
void gotoxy(int x, int y) { COORD c = { x, y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }而不是 borland 特定的gotoxy重现 MCVS15 中的错误。可能gotoxy是问题的根源? -
你确定
gotoxy是线程安全的吗? -
你的调试器告诉你什么了吗?
-
你不会等待线程完成
-
这几乎不可能是线程安全的。您有 2 个不同的线程调用
gotoxy来设置控制台中文本的输出位置 - 这里有一个经典的竞争条件。
标签: c++ multithreading animation console-application borland-c++