【问题标题】:Multi threading with 3rd party headerfiles in Borland C++ 5.02Borland C++ 5.02 中使用 3rd 方头文件的多线程
【发布时间】:2018-03-20 06:20:40
【问题描述】:

是否有任何头文件或扩展名可用于在 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;  }
}

}

是的.. 我知道人们会说,获取一个新的编译器, 我的学校使用旧的编译器作为评分的“标准”,所以请多多包涵。

【问题讨论】:

  • 如果您想知道为什么学校使用旧应用程序,他们认为使用旧系统和东西意味着更容易植入基础知识。一个陈规定型 想法我猜..
  • 如果这就是他们给你的原因,他们就像一块便宜的地毯一样撒谎。他们使用古老的工具,因为 (a) 在许多情况下,它们非常便宜/免费获得许可,同样重要的是,它们可以在古老的硬件上运行。例如:您可以在 30 年前的 8088 上运行 Turbo C。你很疯狂地想要,但你可以。
  • 是的..我知道。可能他们只是懒得更新他们的软件和系统。但这不是重点!

标签: c++ windows multithreading console-application borland-c++


【解决方案1】:

Hans Boehm 写了一篇关于为什么这是一个坏主意的著名论文:Threads cannot be implemented as a library

简而言之,如果你想进行多线程编程,你需要一种语言和编译器来保证线程安全。如果你没有这个,你最终会遇到非常奇怪和难以理解的错误。

顺便说一句,这也是 C++11 引入的线程支持如此重要的主要原因之一:仅使用库是不够的,实际上还需要该语言的适当支持。

由于 Borland C++ 不提供这些保证,因此在将其用于多线程编程时,不要指望它能带你走得太远。

【讨论】:

    【解决方案2】:

    您的代码使用windows.h,这意味着您可以访问 Win32 API。所以看看 Win32 CreateThread() 函数。

    【讨论】:

      【解决方案3】:

      所以我终于找到了一种方法。

      #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;
      }
      

      干得好!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 2014-01-07
        • 1970-01-01
        • 2011-10-02
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多