Seite 1 von 1

Sigbal Parameter in "connect" auslesen?

Verfasst: 23. Juli 2009 15:26
von nierth
Hallo,

ganz einfaches Problem: Kann man einen connect-befehl in der Form:

connect(a, SIGNAL(zx(int)), b.at(int), SLOT(xy));

schreiben? Der übergebene int-Wert soll hierbei als Index gelten, welcher Empfänger angesprochen wird.
Der Hintergrund ist, dass ich eine von der Anzahl an CPU-Kernen abhängige Anzahl an parallel laufenden Threads habe. Allerdings weiß ich diese Anzahl im Voraus nicht.

Grüße,

Thomas

Verfasst: 23. Juli 2009 15:37
von DarkWotan
Hallo,

nein, so geht das nicht. Durch die Makros SIGNAL und SLOT wird der übergebene Text vom Compiler als String behandelt. Ohne diese wäre der Code gar nicht kompilierfähig. Für die Auswertung der Strings ist der moc zuständig. Das int aus deinem Signal kann daher nicht als echter Laufzeitparameter für die at-Methode verwendet werden.
Aber für dein Problem gibt's doch sicher einen eleganten Weg? Du kannst doch abhängig von der Kernzahl entsprechend dynamisch connect()en.

Verfasst: 23. Juli 2009 15:45
von nierth
habe ich noch nie davon gehört, wie geht das?

Verfasst: 23. Juli 2009 15:52
von solarix
sowas nennt man "Schleife"

Code: Alles auswählen

foreach(MyThread *nextThread, threadList) 
  connect(sender, SIGNAL(foo(int),) nextThread, SLOT(doit(int)));

Verfasst: 23. Juli 2009 15:59
von nierth
ich will aber eigentlich jeden Thread mit einem eigenen Signal ansprechen...

Verfasst: 23. Juli 2009 17:14
von DarkWotan
nierth hat geschrieben:ich will aber eigentlich jeden Thread mit einem eigenen Signal ansprechen...
Das wirst du so nicht machen können. Ein Signal ist, wie eine Methode, fix in den Code kompiliert. Du kannst nicht weitere Signale zur Laufzeit hinzufügen. Aber dafür kannst du sie ja mit Parametern versehen. Ich kann mir gerade schlecht ein Szenario vorstellen, in dem dein Weg der elegantere gegenüber allen anderen Möglichkeiten zur Realisierung wäre.
Was genau willst du denn machen?

Verfasst: 23. Juli 2009 17:34
von solarix
Warum denn nicht einfach eine ID mitgeben, und im Slot des Threads "if (id != myId) return;" schreiben? Wird bei Broadcasts häufig gemacht..

Verfasst: 23. Juli 2009 19:18
von nierth
thx solarix, das ist die lösung!