Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf
-
Liebes Forum,
ich hoffe, die Frage ist hier richtig. Ich habe folgendes Problem:Ich programmiere einen GUI unter linux mit gtk-4/glib2.0. In der "activate"-Funktion lasse ich eine Funktion "my_func" mit
g_idle_add ( G_CALLBACK (my_func), pointer_data );
regelmäßig durch den main_loop (g_application_run() ) aufrufen.
Das ganze klappt auch unter x86_64 prima, die Funktion "my_func" wird regelmäßig aufgerufen.
Unter ARM jedoch wird die "my_func"-Funktion lediglich einmal aufgerufen und dann nicht mehr angesprungen. Funktionen, die per Button-Callback aufgerufen werden, funktionieren jedoch zu jedem Zeitpunkt, auch wenn die g_idle_add bereits aufgerufen wurde.Hat jemand eine Erklärung für das unterschiedliche Verhalten in beiden Architekturen?
Ich hoffe, mein Posting enthält genug Infos, wenn nicht, ich liefere gerne weitere Infos.
Viele Grüße
und danke fürs Lesen
und die Mühe
Paule
-
- Ändere den Typ von
my_func
so dass er 1:1 mit dem erwarteten Prototyp übereinstimmt - Lass die Funktion
G_SOURCE_CONTINUE
zurückgeben - Entferne den unnötigen cast beim Aufruf von
g_idle_add
- Ändere den Typ von
-
Vielen dank für die Antwort,
ich habe
die Vorgehensweise hat funktioniert. Aber die Frage ist, soll das so sein, dass das unter ARM so funktioniert?ich habe die Funktion my_func abgeändert in:
static gboolean my_func ( type *data ){
...
return G_SOURCE_CONTINUE;
}und rufe die Funktion direkt auf
...
g_idle_add ( my_func, data );
...Jetzt funktioniert es, aber die Frage ist, soll das so sein? Eigentlich sollte es ja auf verschiedenen Architekturen gleich funktionieren. Ist das ein Bug?
Viele Grüße
und danke für den Rat
Paule
-
@paule sagte in Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf:
Jetzt funktioniert es, aber die Frage ist, soll das so sein? Eigentlich sollte es ja auf verschiedenen Architekturen gleich funktionieren. Ist das ein Bug?
Achje
Was richtig ist, ist eh auf allen Plattformen gleich.
Dein originaler Code war auf allen Plattformen falsch.
Der neue Code ist für alle Plattformen richtig.Dass der alte Code auf einer anderen Plattform trotzdem funktioniert hat, ist einfach Zufall.
Die Funktion die an
g_idle_add
übergeben wird muss als Returntyp immergboolean
haben und immer genau einen Parameter vom Typgpointer
haben. Denn so wird sie von der GLib aufgerufen.Wenn du aber eine Funktion übergibst die gar keinen Wert zurückgibt, dann kann das nicht richtig funktionieren. GLib weiss ja nichts davon dass die Funktion nichts zurückgibt. D.h. GLib schaut dann einfach an der Stelle nach wo der Returnwert sein sollte - was meistens ein CPU Register ist. Und wenn an der Stelle 0 steht (
G_SOURCE_REMOVE
), dann wird die Funktion entfernt und nicht mehr aufgerufen. Und wenn da auf x86 nach dem Aufruf der Funktion halt nie 0 drin war, dann hat es auf x86 halt zufällig funktioniert. Aber falsch war es trotzdem.An diesen Umstand, also dass "funktioniert" nicht "ist richtig" bedeutet, musst du dich bei C gewöhnen. D.h. du musst wissen was du tust, sonst ist die Chance dass dir sowas wieder passiert sehr hoch.
-
Hallo,
@hustbaer sagte in Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf:
Die Funktion die an
g_idle_add
übergeben wird muss als Returntyp immergboolean
haben und immer genau einen Parameter vom Typgpointer
haben. Denn so wird sie von der GLib aufgerufen.Wenn du aber eine Funktion übergibst die gar keinen Wert zurückgibt, dann kann das nicht richtig funktionieren. ...
Ich muss zugeben, ich hatte den Code aus einem Forum zusammengesammelt, als ich nach dem suchte, was g_idle_add oder g_timeout_add macht.
Ich dachte, der Cast sorgt automatisch dafür, dass G_SOURCE_CONTINUE zurückgegeben wird, unabhängig, was die Funktion zurückgibt (in meinem Fall eben nichts).@hustbaer sagte in Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf:
An diesen Umstand, also dass "funktioniert" nicht "ist richtig" bedeutet, musst du dich bei C gewöhnen. D.h. du musst wissen was du tust, sonst ist die Chance dass dir sowas wieder passiert sehr hoch.
Das das bei C so ist, war mir klar :). ich bin nur noch recht frisch in GTK/Glib/GObject und mir brummt der Kopf von den ganzen (zum Teil automatisch generierten) Casts, Macros, Funtionen etc. Auf jeden Fall danke dafür, das Dickicht etwas zurechtzuschneiden.
Viele Grüße
und danke
PauleAn diesen Umstand, also dass "funktioniert" nicht "ist richtig" bedeutet, musst du dich bei C gewöhnen. D.h. du musst wissen was du tust, sonst ist die Chance dass dir sowas wieder passiert sehr hoch.