gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:00:04 25 4
gpt4 key购买 nike

我刚刚在树莓派 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com