相关疑难解决方法(0)

你将如何实现一个基本的事件循环?

如果你使用过gui工具包,你就知道有一个事件循环/主循环应该在一切完成后执行,这将使应用程序保持活跃并响应不同的事件.例如,对于Qt,您可以在main()中执行此操作:

int main() {
    QApplication app(argc, argv);
    // init code
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,app.exec()是应用程序的主循环.

实现这种循环的显而易见的方法是:

void exec() {
    while (1) {
        process_events(); // create a thread for each new event (possibly?)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这会将CPU限制在100%并且实际上是无用的.现在,我如何实现这样一个响应的事件循环,而不必完全占用CPU?

回答在Python和/或C++中受到赞赏.谢谢.

脚注:为了学习,我将实现自己的信号/插槽,我会用它们来生成自定义事件(例如go_forward_event(steps)).但是如果你知道如何手动使用系统事件,我也想知道这一点.

c++ python event-loop blocking

56
推荐指数
5
解决办法
3万
查看次数

如何在没有窗口类的情况下编写QT系统托盘应用程序,并将其与另一个进程集成?

这是我的设置:

  • 一个持续运行并完成其工作的后台进程。

  • 启动上述进程并监视它的启动器,如果崩溃或终止则重新启动它。

我希望添加对启动程序进程的系统托盘访问权限(理想情况下,启动程序进程将包含系统托盘显示的代码),并启用从系统托盘上下文菜单触发基本选项(启动、停止等)。系统托盘不需要自己的窗口。只是一个无窗口系统托盘,带有包含 2-3 个选项的上下文菜单。

由于到目前为止编写的所有代码都是用 C/C++ 编写的,并且我需要它在 Windows 和 Linux 上运行,因此 QT 是显而易见的选择。我发现通过基本的 QT 启动器托盘显示非常令人沮丧。我见过的几乎每个示例都QSystemTrayIcon包含“主窗口”继承。

下面是我用来创建系统托盘的代码。

#include <QtWidgets/QApplication>
#include <QtCore/QDebug>
#include <QtGui/QIcon>
#include <QtWidgets/QSystemTrayIcon>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>


int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QPixmap oPixmap(32,32);
    //QMenu* menu1 = new QMenu(); // want to get a context menu from system tray
    oPixmap.load ("systemTrayIcon.png");

    QIcon oIcon( oPixmap );

    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(oIcon);
    qDebug() << trayIcon->isSystemTrayAvailable();
    trayIcon->setContextMenu( menu1);
    trayIcon->setVisible(true);
    trayIcon->showMessage("Test Message", "Text", …
Run Code Online (Sandbox Code Playgroud)

c++ qt system-tray qt5

7
推荐指数
1
解决办法
8617
查看次数

Perl和X Window中没有事件循环图形?

在20世纪80年代的Apple II BASIC上,您将使用"HGR"进入屏幕,"HCOLOR"将设置颜色,"HPLOT"将绘制点.您还可以操作屏幕字节数据,而不必将程序控制交给任何事件处理程序.今天,每种语言和每个图书馆似乎都缺少这种荒谬的基本功能.

所以我使用X Window API 在C中编写了一个小型库来执行此操作:HGR(x,y)设置XWindow,HCOLOR(i)设置颜色,HPLOT(i,j)绘制一个点,加上你提取窗口的位图,可以修改它并显示修改过的东西.这不是直截了当的,我不想再次通过它.

我现在正在使用Perl做一些事情,我需要Perl这样的工具,你可以调用一个子程序,最好在没有产生新线程的情况下返回,输出一个窗口,你可以在窗口中添加图形内容,以及在您的程序感觉它时查询事件.这是1980年代BASIC的功能,所以它应该不难.但是我看到的工具没有这样做:

  • GD:据我所知,这会产生图形文件,而不是图形窗口.看来你需要把它管道到另一个程序.
  • Gtk2:我必须派出一个单独的线程来捕获事件,否则它将不会显示窗口.我不想分叉任何东西,而且我大多不关心任何事件,除非我特别要求稍后看到堆积在队列中的东西.
  • Qt:在这里你也可以将控制权移交给事件处理程序,没有交接,没有显示.在C++版本中,我可以让Qt在没有切换的情况下显示和绘制.
  • PerlTk:再次与愚蠢的交接.
  • OpenGL:在这里,当我想看看发生了什么时,我不知道如何捕捉X Window事件,比如按键.

有没有人知道如何从正在运行的应用程序中放置一个XWindow,而不需要一个GUI应用程序进程,在这里您可以在窗口中绘制原始内容,如点和线,以及您可以按照自己的计划查询窗口事件的位置?我简要地看了一下Perl的X Window API,它和C一样可怕,并且将C代码与Perl连接起来也是可怕的.如有必要,我会这样做.但也许不是.Perl有没有HGR?

如果您想知道我的意思,没有事件循环图形库,请参阅此链接文章,遗憾的是C语言.这对于科学的东西非常有用,除了介绍性编程类之外.

graphics perl event-loop

6
推荐指数
1
解决办法
571
查看次数

标签 统计

c++ ×2

event-loop ×2

blocking ×1

graphics ×1

perl ×1

python ×1

qt ×1

qt5 ×1

system-tray ×1