C ++系统调用线程

时间:2017-09-24 22:39:38

标签: c++ multithreading pthreads

您好我正在尝试编写一个程序,该程序将创建一个线程,系统将在其中调用char缓冲区。我是线程的新手,我很难让线程工作。 我得到的大部分内容都来自于gooogle搜索和观看视频。

这是我到目前为止所拥有的。

#define BUFFERSIZE 25

DWORD WINAPI ThreadFunc(LPVOID param);

int main()
{
    while (1)
    {
        char buffer[BUFFERSIZE];
        DWORD threadID;
        HANDLE ThreadHandle;

        fgets(buffer,BUFFERSIZE,stdin);

        if (buffer == "dir")
        {
            ThreadHandle = CreateThread(NULL, 0,ThreadFunc, &buffer, 0, &threadID);
        }
        else if (buffer == "help")
        {

        }
        else if (buffer == "vol")
        {

        }
        else if (buffer == "path")
        {

        }
        else if (buffer == "tasklist")
        {

        }
        else if (buffer == "notepad")
        {

        }
        else if (buffer == "echo")
        {

        }
        else if (buffer == "color")
        {

        }
        else
        {

        }
    }
}

DWORD WINAPI ThreadFunc(LPVOID param)
{
    char* value = (char*)param;
    system(value);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

似乎有两个错误:

<强>第一

ThreadHandle = CreateThread(NULL, 0,ThreadFunc, &buffer, 0, &threadID)

应该是

ThreadHandle = CreateThread(NULL, 0,ThreadFunc, buffer, 0, &threadID)

请注意,缓冲区丢失了&,因为数组的名称已经是指向它的指针。

<强>第二

运行第二个线程后,主线程立即退出。 遗憾的是,只要主线程存在,进程就会终止,所以没有任何反应。尝试在主线程中添加一个睡眠。

答案 1 :(得分:0)

您的代码几乎没有问题:

     1.正如Daniel指出的那样,CreateThread(缓冲区)的参数不正确。您使用错误的类型和变量范围。
       2. if语句中的表达式将始终评估为false。像char *这样的类型没有重载运算符,而==会导致指针比较。
      #define BUFFERSIZE 25
      
      DWORD WINAPI ThreadFunc(LPVOID param);
      
      int main()
      {
          while (1)
          {
              char* buffer = new char [BUFFERSIZE];
              DWORD threadID;
              HANDLE ThreadHandle;
      
              fgets(buffer,BUFFERSIZE,stdin);
      
              if (strcmp(buffer, "dir") == 0)
              {
                  ThreadHandle = CreateThread(NULL, 0,ThreadFunc, buffer, 0, &threadID);
              }
              else if(...) // next
              {
              }
              else
              {
                  delete[] buffer;
              }
          }
      }
      
      DWORD WINAPI ThreadFunc(LPVOID param)
      {
          char* value = (char*)param;
          system(value);
          delete[] value;
          return 0;
      }