c - gtk_main() 与 while(1) Raspberry Pi 3

标签 c raspberry-pi gtk geany

我刚刚在树莓派 3 上开始了我的第一个 C 语言项目,我想为触摸屏创建我的第一个 GUI 应用程序。 我的目标是运行 while(1) 循环来控制树莓派 I/O 和 gtk_main 函数来打开一个简单的窗口。

调用 gtk_main() 后,其余代码不起作用。我知道这是由 gtk_main 创建它自己的循环引起的。有没有办法同时运行这两个循环?

#include <stdio.h>    // Used for printf() statements
#include <wiringPi.h> // Include WiringPi library!
#include <gtk/gtk.h>

// Pin number declarations. We're using the Broadcom chip pin numbers.
const int pwmPin = 18; // PWM LED - Broadcom pin 18, P1 pin 12
const int ledPin = 23; // Regular LED - Broadcom pin 23, P1 pin 16
const int butPin = 21; // Active-low button - Broadcom pin 17, P1 pin 11    

const int pwmValue = 0; // Use this to set an LED brightness

int main(int argc, char *argv[]){

    int add = 0;
    int sign = 1;
    // Setup stuff:
    wiringPiSetupGpio(); // Initialize wiringPi -- using Broadcom pin numbers

    pinMode(pwmPin, PWM_OUTPUT); // Set PWM LED as PWM output
    pinMode(ledPin, OUTPUT);     // Set regular LED as output
    pinMode(butPin, INPUT);      // Set button as INPUT
    pullUpDnControl(butPin, PUD_UP); // Enable pull-up resistor on button

    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_show (window);

    gtk_main ();

    // Loop (while(1)):
    while(1)
    {
        if (digitalRead(butPin)) // Button is released if this returns 1
        {
            pwmWrite(pwmPin, pwmValue+add); // PWM LED at bright setting
            digitalWrite(ledPin, LOW);     // Regular LED off
            add=add+(sign*50);
            if (add==1000) sign=-1;
            if (add==0) sign=1;
            delay(50);
        }
        else // If digitalRead returns 0, button is pressed
        {
            pwmWrite(pwmPin, 1024 - pwmValue); // PWM LED at dim setting
            // Do some blinking on the ledPin:
            digitalWrite(ledPin, HIGH); // Turn LED ON
            delay(75); // Wait 75ms
            digitalWrite(ledPin, LOW); // Turn LED OFF
            delay(75); // Wait 75ms again
        }
    }    

}

最佳答案

gtk_maindocumented如:

Runs the main loop until gtk_main_quit() is called.

You can nest calls to gtk_main(). In that case gtk_main_quit() will make the innermost invocation of the main loop return.

所以你需要一些callback 显式调用gtk_main_quit(我猜你没有)。

所以这种行为是预期的。您可能想要处理 "delete-event" GTK signal在您的窗口上(通过让您的GTK信号处理程序为该事件显式调用gtk_main_quit)。您需要阅读更多内容,特别是关于 GTK event loop ,和GObject's signals .

如果你想poll(2)read(2)对于某些设备,您最好在 GTK 事件循环内执行此操作(例如,通过调用 g_source_add_unix_fdg_io_channel_unix_new 等)。

您应该花几天时间阅读更多有关 Gtk 的内容,特别是它的 Getting Started章节。

关于c - gtk_main() 与 while(1) Raspberry Pi 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42370554/

相关文章:

python-2.7 - Epiphany 浏览器在 python 的同一选项卡中打开 URL

c - 除非光标位于滚动条上方,否则 GtkScrolledWindow 不响应鼠标滚轮

c++ - sizeof(str -1) 和 sizeof(str) -1 之间的区别?

c++ - 从 C、C++ 在 Linux 中发出系统命令

mysql - 从 C 访问 MySQL 数据库

c - 从程序集调用 c 函数的段错误

linux - 带有 freerdp 非事件超时的远程桌面

c++ - 使用UDP进行写入和读取之间的长时间延迟

c - 我如何运行 gtk 演示?

python - 有没有办法用 PyGTK AppIndicator 检测鼠标点击