Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两个窗口-一个由线程随机输出修改_C++_Multithreading_C++11_Ncurses - Fatal编程技术网

C++ 两个窗口-一个由线程随机输出修改

C++ 两个窗口-一个由线程随机输出修改,c++,multithreading,c++11,ncurses,C++,Multithreading,C++11,Ncurses,我试图编写这样的代码:屏幕分为两个窗口,其中一个窗口由不同的线程修改,但输出似乎非常随机。有人能帮忙吗?控制台的上部应通过main进行修改,下部应通过螺纹k进行修改 #include <stdio.h> #include <ncurses.h> #include <unistd.h> #include <thread> #define WIDTH 30 #define HEIGHT 10 int startx = 0; int starty =

我试图编写这样的代码:屏幕分为两个窗口,其中一个窗口由不同的线程修改,但输出似乎非常随机。有人能帮忙吗?控制台的上部应通过main进行修改,下部应通过螺纹
k
进行修改

#include <stdio.h>
#include <ncurses.h>
#include <unistd.h>
#include <thread>
#define WIDTH 30
#define HEIGHT 10 

int startx = 0;
int starty = 0;
void kupa (int score_size, int parent_x, int parent_y)
{
    int i = 0;
    WINDOW *dupa = newwin(score_size, parent_x, parent_y - score_size, 0);
    while(true)
    {

        i++;

        mvwprintw(dupa, 0 , 0, "You chose choice %d with choice string", i);
        wrefresh(dupa);  
        sleep(5);
        wclear(dupa);
    }
    delwin(dupa);
}
int main ()
{
      int parent_x, parent_y;
      int score_size =10;
      int counter =0 ;
      initscr();
      noecho();
      curs_set(FALSE);
      getmaxyx(stdscr, parent_y, parent_x);
      WINDOW *field = newwin(parent_y - score_size, parent_x, 0, 0);
      std::thread k (kupa, score_size, parent_x, parent_y);
      while(true) {
          mvwprintw(field, 0, counter, "Field");
          wrefresh(field);
          sleep(5);
          wclear(field);
          counter++;
      }
      k.join();
      delwin(field);
}
#包括
#包括
#包括
#包括
#定义宽度30
#定义高度10
int startx=0;
int starty=0;
void kupa(整数分数大小,整数父项x,整数父项y)
{
int i=0;
WINDOW*dupa=newwin(分数大小,父项x,父项y-分数大小,0);
while(true)
{
i++;
mvwprintw(dupa,0,0,“您使用选项字符串选择了选项%d”,i);
雷弗斯(杜帕);
睡眠(5);
wclear(dupa);
}
德尔温(杜帕);
}
int main()
{
int parent_x,parent_y;
int分数_大小=10;
int计数器=0;
initscr();
noecho();
curs_set(假);
getmaxyx(stdscr、父项y、父项x);
窗口*字段=newwin(父项y-分数大小,父项x,0,0);
标准:螺纹k(kupa、分数大小、父螺纹x、父螺纹y);
while(true){
mvwprintw(字段,0,计数器,“字段”);
雷弗斯(外地);
睡眠(5);
wclear(field);
计数器++;
}
k、 join();
德尔温(外地);
}

我不确定您想做什么,但这种行为很正常。处于活动状态的线程写入窗口,当系统切换任务时,另一个线程写入窗口。正常的行为是只使用一个线程写入窗口。其他线程应该只做一些工作。
无论如何,如果要使用多个线程,则必须使用事件、互斥体、队列、信号量或其他方法来同步它们

我不知道你想做什么,但这种行为很正常。处于活动状态的线程写入窗口,当系统切换任务时,另一个线程写入窗口。正常的行为是只使用一个线程写入窗口。其他线程应该只做一些工作。
无论如何,如果要使用多个线程,则必须使用事件、互斥体、队列、信号量或其他方法来同步它们

底层curses/ncurses库不是线程安全的(例如,请参见讨论该术语的示例)。对于curses,这意味着库的
窗口
结构(如
stdscr
)是全局变量,不受互斥体或其他方法保护。该库还具有跨窗口共享的内部静态数据。使用以下策略之一只能获得多线程代码的可靠结果:

  • 在一个线程内执行所有窗口管理(包括输入)
  • 使用互斥锁、信号量或任何看起来最好的技术来管理“拥有”单独窗口的单独线程。要在这里成功,线程必须拥有整个屏幕,从等待输入时诅咒库阻塞的位置开始,直到更新屏幕并继续等待输入为止。这比听起来更难
并且可以编译up,以提供对和一些线程化应用程序的基本支持。为此,它使用围绕其静态数据的互斥体,将全局变量转换为“getter”函数,并添加显式传递
屏幕
指针的函数,这在许多调用中都是隐含的。有关更多详细信息,请参见

ncurses的一些测试程序说明了线程支持(这些程序位于源代码的
test
子目录中):

  • 同上,显示
    使用屏幕
  • test_opaque执行
    窗口
    属性的“getter”
  • 雨水显示
    使用\u窗口
  • 蠕虫显示
    使用\u窗口

底层curses/ncurses库不是线程安全的(例如,请参见讨论该术语的示例)。对于curses,这意味着库的
窗口
结构(如
stdscr
)是全局变量,不受互斥体或其他方法保护。该库还具有跨窗口共享的内部静态数据。使用以下策略之一只能获得多线程代码的可靠结果:

  • 在一个线程内执行所有窗口管理(包括输入)
  • 使用互斥锁、信号量或任何看起来最好的技术来管理“拥有”单独窗口的单独线程。要在这里成功,线程必须拥有整个屏幕,从等待输入时诅咒库阻塞的位置开始,直到更新屏幕并继续等待输入为止。这比听起来更难
并且可以编译up,以提供对和一些线程化应用程序的基本支持。为此,它使用围绕其静态数据的互斥体,将全局变量转换为“getter”函数,并添加显式传递
屏幕
指针的函数,这在许多调用中都是隐含的。有关更多详细信息,请参见

ncurses的一些测试程序说明了线程支持(这些程序位于源代码的
test
子目录中):

  • 同上,显示
    使用屏幕
  • test_opaque执行
    窗口
    属性的“getter”
  • 雨水显示
    使用\u窗口
  • 蠕虫显示
    使用\u窗口

您的问题到底是什么?错误?会发生什么?你说的“随机”是什么意思?多了解一点信息会很有帮助…你到底有什么问题?错误?会发生什么?你说的“随机”是什么意思?多了解一些信息会很有帮助…你能给我展示一下使用屏幕调用功能的例子吗?你能给我展示一下使用屏幕调用功能的例子吗?