Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Terminal 将旧DOS TUI移植到ncurses 我想对如何在90年代初移植MS-DOS的C++程序提出一些建议。_Terminal_Cross Platform_Ncurses - Fatal编程技术网

Terminal 将旧DOS TUI移植到ncurses 我想对如何在90年代初移植MS-DOS的C++程序提出一些建议。

Terminal 将旧DOS TUI移植到ncurses 我想对如何在90年代初移植MS-DOS的C++程序提出一些建议。,terminal,cross-platform,ncurses,Terminal,Cross Platform,Ncurses,这个程序实现了一个相当复杂的文本用户界面。接口代码与逻辑分离得很好,我认为使用ncurses不会太困难 作为一个完全的新手,我有几个问题: DOS程序拦截中断0x33以处理鼠标事件。中断处理程序将事件存储在FIFO中,主程序定期将其汇集。FIFO中的每个元素都是一个C结构,包含有关事件性质、鼠标位置及其按钮状态的信息。为了保持代码的逻辑不变,我考虑启动一个线程,该线程在无限循环中异步调用getch,并以与旧程序相同的方式填充FIFO。我的想法是,这个线程,而且只有这个线程,应该访问stdin,而

这个程序实现了一个相当复杂的文本用户界面。接口代码与逻辑分离得很好,我认为使用ncurses不会太困难

作为一个完全的新手,我有几个问题:

DOS程序拦截中断0x33以处理鼠标事件。中断处理程序将事件存储在FIFO中,主程序定期将其汇集。FIFO中的每个元素都是一个C结构,包含有关事件性质、鼠标位置及其按钮状态的信息。为了保持代码的逻辑不变,我考虑启动一个线程,该线程在无限循环中异步调用getch,并以与旧程序相同的方式填充FIFO。我的想法是,这个线程,而且只有这个线程,应该访问stdin,而主线程只负责通过add_wch和类似的方式访问stdout。以这种方式使用ncurses是安全的,还是stdin/stdout访问总是需要在同一个线程中完成

在这个应用程序中设置颜色的方式是非常拜占庭式的,因为它使用了继承调色板的概念。基本上,一个窗口通常指定背景和前景颜色,该窗口中的每个小部件仅设置前景,但少数小部件会重新定义fg/bg。我知道ncurses的attr总是希望使用pairs来指定颜色,这必须使用initp进行初始化,这与该程序的逻辑不符。因此,当程序想要分别更改fg/bg颜色时,我考虑使用tiparm直接发送setaf/setbf序列。我将失去在不支持setaf/setbf的终端上运行代码的能力,但这不会是一个巨大的损失。发送setaf/setbf控制序列,然后调用add_wch之类的函数是否安全,还是后者应仅与attr关联使用

我可以编写一些测试脚本来检查我的想法是否有效,但我不确定这种方法是否总是有效


谢谢你的帮助

有很多可能性,但是所描述的方法听起来像是低级的而不是诅咒,除了提到add_wch。curses应用程序将使用wattr\u集、init\u对、start\u颜色等,而不是tiparm

ncurses I/O必须在一个线程中;虽然ncurses可以通过在某些地方使用互斥来进行编译以提供帮助,但打包人员通常忽略了这一点,即使使用这种配置,应用程序开发人员仍然需要做一些工作

进一步阅读:


你对terminfo的评论是对的,事实上我主要对ncurses的getch函数感兴趣。它的实现似乎远非微不足道。如果我理解您的评论,那么在主线程中使用低级terminfo函数和printf,在事件线程中使用getch就可以了,因为所有ncurses函数(只有这一个)实际上都会在同一个线程中调用。这是否正确?getch不是低级函数,它是curses库的一部分,必须使用initscr或newterm初始化,并将使用其他curses库函数更新屏幕。即使使用有助于线程化的ncurses配置,tparm、tputs等仍需要互斥。非常感谢Thomas,这正是我需要的信息,尽管这不是我所希望的…。