amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > filerequester task [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 -2- 3 [ - Beitrag schreiben - ]

22.12.2011, 22:55 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Ich versteh noch nicht wieso der Scan Task sich den Zeiger immer neu holen muss. Ich dachte es reicht wenn ich dem Scanner beim Start einen Pointer auf gemeinsame Variablen gebe, zB eben den Pointer auf die Listview. Wenn ich die Listview freigebe und der Scantask löppt noch, kann ich ja vom Mainthread aus dem scantask signalisieren dass er zunm ende kommen soll und warten bis der scantask beendet ist.

ps: wenn es die semaphore für jede applikation gobal gibt, dann kann ja der scan task auch einen pointer darauf besitzen.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 22.12.2011 um 23:11 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.12.2011, 23:08 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

> Die Semaphore kannst du je generell vor jedem Zeichenvorgang holen, so hast du den Mechanismus nicht nur für dein Listview sondern für alle Widgets.

Die Brauche ich nur holen, wenn der Zeichenvorgang durch ein Signal von außen ausgelöst wurde. Oder?


--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 22.12.2011 um 23:08 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.12.2011, 07:44 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Wie ist denn das? Müsste ich nicht überhaupt vor ALLEM, was der GUI Task tut mir den Lock auf die Applikation mit allen Features holen? Es ist doch möglich, dass de Benutzer die Listview scrollt, während Einträge aus dem Dir Thread rein kommen. Der GUI Task dürfte nur dann scrollen und dabei die Coordinaten der Items neu berechnen, wenn der Dir Task gerade nicht darauf zugreift. Also dürfte das GUI System in der gelockten App garnix tun außer warten auf das Lock, nach (oder schon vor?) jeder Benutzereingabe und bei jedem Refresh Signal von außen?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 23.12.2011 um 07:53 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.12.2011, 11:35 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@AGSzabo:

Korrekt, wenn du Threadsafe sein willst, dann müsstest du alle Resourcen die du benutzt locken, ja. Im einfachsten Fall machst du einen Lock für das ganze GUI System, aber dann würden sich u.U. Programme behindern.
Nächste Stufe wäre dann einen Lock pro Applikation. Oder man geht noch weiter runter und macht einen Lock auf jedes GUI Objekt, das ist aber etwas Overkill, weil dann jedes Objekt eine Semaphore braucht, und man kann schnell den Überblick verlieren was man nun alles Locken muss und was nicht. Ich denke pro Applikation ist ausreichend.

Wirklich schlimm ist das aber nicht. Im schlimmsten Fall erzwingst du eine Nacheinander-Ausführung wie in einem einzelnen Thread.

Natürlich ist das dann auch immer noch möglich, dass der Nutzer durch einen ListView scrollt, während neue Ergebnisse eingetragen werden. Der Lock wird ja nur innerhalb der Zeitspanne gemacht, wo neue Scan Einträge vorliegen bis die neuen Einträge in die Liste gehängt sind. Aber nicht für den ganzen Scan Vorgang.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

23.12.2011, 13:02 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Ok. Also wann lockt sich die App selbst? Direkt nach dem Eingang eines Intuition Events bzw des Refresh-Signals, oder? Kann da der Read Task noch dazwischen kommen?

Noch ist auch ungeklärt, wie ich dem Dir Process den Zeiger auf meine Variablen übermittle, da stünde nämlich auch der Zeiger auf die Semafore drin, sowie der Zeiger auf die Listview.

ps: habe einen weg gefunden den pointer auf meine variablen durch zu bekommen: um das CreateNewProc() herum ein Forbid/Permit und dazwischen den Pointer in TC_Userdata schreiben. Ganz einfach.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 23.12.2011 um 23:18 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.12.2011, 10:08 Uhr

AGSzabo
Posts: 1663
Nutzer
PROCESS EXITCODE


folgender code produziert einen gelben Guru 0100000F, wenn er das erste mal durchlaufen wird:

code:
.process_exit	move.l	4.w,a6

		jsr	_LVOForbid(a6)		; dont let main task quit before we are done

		sub.l	a1,a1
		jsr	_LVOFindTask(a6)

		move.l	d0,a0
		move.l	TC_Userdata(a0),a3

		bclr	#oxFRB_SCANNING,oxFR_flags(a3)

		move.l	oxFR_maintask(a3),a1

		moveq	#SIGF_SINGLE,d0
		jmp	_LVOSignal(a6)		; allow main process to quit



und zwar in der Zeile "move.l TC_Userdata(a0),a3". Ich habe überprüft. was danach in a3 steht, der inhalt von a3 ist korrekt. der guru bedeutet, wenn ich das richtig verstehe, dass ein speicher freigegeben wird, der nimmer allokiert ist:

Zitat:
Memory header not located. [ Usually an invalid address passed to FreeMem() ]

wenn ich den exitcode nicht explizit als solchen benutze, sondern ihn einfach ans ende des prozesses hänge, dann gibts keinen fehler. grübel ...


--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 24.12.2011 um 10:13 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 13:33 Uhr

AGSzabo
Posts: 1663
Nutzer
Ich habe den Auslöser des Guru im Process-Exitcode gefunden: der Register a3 darf darin nicht verändert werden! Es stand nirgends in den docs, dass man im Exitcode Register retten muss!
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 13:50 Uhr

Thore
Posts: 2266
Nutzer
Nur daß man in Unterprogramen Register retten muss/soll ;)
Ein Exit Code ist ebenfalls ein Unterprogramm :)
Aber schön daß Du es rausgefunden hast.

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 15:52 Uhr

AGSzabo
Posts: 1663
Nutzer
So. Danke an alle Beteiligten, der scan process scannt nun und das GUI bleibt währenddessen klickbar. Als Feinschliff hätte ich gerne noch ein paar Tips, wohin mit den ganzen Strings für die Dateinamen (und Größen und etc). Soll die ListView sich diese Strings zu sich selber hin kopieren oder soll die Applikation die Macht darauf behalten?

ps: und befor ich es vergesse zu sagen, es ist deutlich langsamer als der ASL requester!

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 25.12.2011 um 16:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 18:58 Uhr

AGSzabo
Posts: 1663
Nutzer
Ok, folgendes:

Es ist vermutlich total langsam, weil:

1. ein Eintrag wird gelesen und in eine temporäre liste gefügt

2. wenn der lock auf die App NICHT erhätlich ist, dann 1.

3. wenn der lock auf die App erhältlich ist, werden ALLE temporären Einträge in die ListView eingefügt und es wird refresht (das Refreshen lockt GUI-Task seitig die App!)

4. wenn weitere Directory Einträge vorhanden sind, dann 1.


Das ganze ist langsam, WEIL offenbar der Lock auf die App in Schritt 2 IMMER erhältlich ist. Das bedeutet, es wird nach jedem Eintrag refresht! Das Refreshen geht so schnell, dass beim Schritt 4. die App schon wieder frei zu sein scheint. Damit bekommt der Dir-Task den Lock und füllt den eben gelesenen Eintrag in die Liste.

Hat jemand eine Idee ob meine Analyse richtig ist bzw was man da machen kann?

ps: Wenn ich das zwischendurchliche Auffüllen in 3. raus nehme und bloß am Ende des Dir-lese-Vorgangs die ListView auf fülle, ist es verdammt schnell!
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 19:20 Uhr

Thore
Posts: 2266
Nutzer
wie ich es verstanden hab, zeichnest du jeden Node mehrmals, je nachdem wieviele Nodes kommen. Also so:
1, 1-2, 1-2-3, 1-2-3-4, 1-2-3-4-5 etc pp
Also sind das n(n+1) / 2 Durchläufe.
Bei 5 Nodes sind das 5*6 / 2 = 15 Nodes Refresh
Bei 100 Nodes sind das 100*101 / 2 = 5050 mal Nodes Refresh.
Bei 1000 Nodes sind das 1000*1001 / 2 = 500500 Nodes Refresh

Du siehst wie schnell das explodiert. Du solltest eine Möglichkeit suchen, die Nodes nicht mehrmals zu refreshen, wenn nicht nötig, und nur die zu zeichnen die auch sichtbar sind.

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 20:53 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Da ist was dran. Es wird zwar nur neu gezeichnet was auch sichtbar ist, aber es wird immer die ganze Listview neu gelayouted, weil sich theoretisch viel ändern kann, siehe unten. Dabei würde es genügen, die Höhe der neuen Zeile zur (teils unsichtbaren) Gruppenhöhe zu addieren und den Scroller mit diesem Maxwert neu zu berechnen und zu zeichnen. Das wäre der Fast-Modus. Es kann aber auch nötig werden, viel mehr neu zu berechnen, weil der neue Eintrag evtl. in die Mitte zwischen die anderen Einträge eingefügt werden kann und/oder weil nach dem Einfügen des Neuen Eintrages eine Sortierung stattfinden kann. Hmmm...

ps: diese zuletzt genannten Features sind nicht zu vernachlässigen. man soll ja sortieren können und auch neue Einträge in die Mitte oder in Folder-Nodes einzufügen.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 25.12.2011 um 20:58 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 21:07 Uhr

AGSzabo
Posts: 1663
Nutzer
Und da war noch dieses: Soll die ListView sich alle Strings (Dateiname etc) zu sich selber hin kopieren oder soll die Applikation die Macht darauf behalten?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 21:10 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Fang nicht mit verschiedenen "Modi" oder "Fast" oder sonstigen Ausnahmen an. Das bringt dich früher oder später zum Verzweifeln und würde dem Projekt einen sicheren, langsamen und obendrein qualvollen Tod bescheren.

Denke dran: "Don't optimize yet!".

Was du tun willst ist, unnötige Refreshes zu vermeiden, also einen bessere Strategie zu nutzen (also die Komplexität zu senken) anstatt den Code zu beschleunigen und dir dabei Restriktionen einzufahren. Habe ganz vergessen, das wir ja auf einem Single Core arbeiten, und daher das Refresh den Scan Task blockiert.
Also was kann man tun?

Jedes x-te mal refreshen kommt einem schnell in den Kopf, ist aber gar keine gute Idee. Denn wenn das Device sehr schnell ist, wird es immer noch deutlich ausgebremst, und wenn es sehr langsam ist, dann tröpfeln die Dateien unnötig langsam rein. Du würdest dann eine bestimmte Scann Geschwindigkeit annehmen, und sowas ist niemals eine gute Idee.
Sieht man leider immer wieder an alten Programmen, die annahmen du arbeitest mit einer Diskette und refreshen z.B. einen Progressbar alle 2KB, was damals dann vielleicht ok war, heute aber dazu führt dass der Progressbar Refresh 99% der Zeit in Anspruch nimmt.

Nein, eine Zeitmessung muss her, damit wir nicht sinnlos refreshen. Dafür gibt es die Intuiticks. Wenn ich mir das genau ansehe, ist auch die Refresh Rate des ASL in etwa die der IntuiTicks (geschätzte 5 Hz?)

Daher mein Vorschlag:

Lese die Liste ein OHNE erstmal pauschal einen Refresh Signal zu senden. Sende das Signal erst, wenn

a) der Scann zu Ende ist.
b) der GUI Task dich mit einem weiteren Signal "anpingt". Dieses Anpingen macht der GUI Task dann immer nur dann, wenn er eine IDCMP_INTUITICK Message bekommst.

Fall b) passiert nur, wenn das Fenster aktiv ist. Das finde ich persönlich aber ok so, denn wenn das Fenster nicht aktive ist, wird der User in der Regel sich auch nicht damit befassen und ein Echtzeit Refresh ist nicht wichtig.




--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 25.12.2011 um 21:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 21:22 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Das ListView sollte entweder die volle Kontrolle über die Daten haben (naive Methode), oder du implementierest einen "Adapter".

Der Adapter ist eine Art Callback Hook die der Anwender des GUI Toolkits schreibt, die dem Listview die Daten in dem Moment liefert, wo er sie haben will. So kann man unheimlich viel Resourcen sparen. Stell dir z.b. eine Liste mit 1 Mio Einträgen vor. Die Einträge stehen z.B. in einer Datenbank.
Wenn du ein Fenster öffnest mit einem Listview der die Anzeigen soll, und die werden erstmal alle in den Listview kopiert, verbraucht das massig Zeit und Speicher.
Mit einem Adapter würde der Listview nur gesagt bekommen dass es 1Mio Einträge sind, aber nur die erste handvoll anfragen, die sichtbar sind. Die anderen werden erst beim Durchscrollen angefragt.





--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

25.12.2011, 22:56 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

> INTUITICKS

Habe es gecodet und festgestellt, dass Intuiticks viel zu oft kommen. Dann habe ich das im_Micros Feld mit #$fff80000 geANDet und mit dem vorherigen so erhaltenen Wert verglichen. Jetzt trudeln die Nodes in gehackten Zeitabständen von ca ner halben Sekunde bis zu einer Sekjnde ein. Das Laden wird dadurch trotzdem langsamer und so wie bei ASL sieht es nicht aus. Habe ich etwas falsch gemacht?

ps: zwei oder mehr cores wären suppa, dann könnte der scan task das dir einlesen, während der gui task zeichnet. würde aber bei mir nicht viel bringen, weil der scan task für das anfügen von neuen rows und das anschließende neuberechnen des layouts zuständig ist und das aber nur machen kann, wenn der gui task nicht gerade zum zeichnen die app gelockt hat. während der scan task items anhängt und das layout neu berechnet, kann er nicht das dir einlesen.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 25.12.2011 um 23:46 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

26.12.2011, 10:49 Uhr

Der_Wanderer
Posts: 1229
Nutzer
> kann er nicht das dir einlesen.
Vielleicht ist das dein Problem. Du solltest "AtemptSemaphore()" machen, nicht "ObtainSemaphore". Dann schaut er nur nach, ob die Semaphore gerade frei ist, und wenn nicht, dann fügst du die Einträge eben nicht in den ListView sondern scannst erstmal weiter.
Stimmt schon, dass das bei einem Single Core relativ selten passiert, evtl. verschätze ich mich da.

Die INTUITICKS sollten genau richtig kommen. Wenn die zu oft kommen, dann stimmt irgendwas nicht. Die sollten so in etwa mit 5Hz kommen.
Ein Refresh von 1 oder 2 Hz würde ich etwas langsam finden.

Aber du sagst ja, dass selbst das einen fühlbaren Slowdown bringt, das ist seltsam, es sei denn dein Refresh würde wirklich sehr lange brauchen.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

26.12.2011, 11:32 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Es steht schon auf AttemptSemaphore(), wie zuvor beschprochen. Der Refresh geht normalerweise schnell genug so dass man unter OS 4.1 auf dem SAM440ep mini das Fenster in Echtzeit resizen kann.
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

27.12.2011, 22:33 Uhr

AGSzabo
Posts: 1663
Nutzer
Bin ratlos. Es funktioniert manchmal nicht, System friert manchmal während dem Einfügen und neu Layouten ein, wenn ich währenddessen das Fenster verschiebe. WinUAEEnforcer sagt der Absturz geschehe im Input Device. Was könnte das sein?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 11:17 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Dein Code ist vermutlich nicht threadsafe.
Paralleles Programmieren erfordert eine genaues Verständnis und Erfahrung dessen, was man da macht. Evtl. machst du das doch lieber Single threaded?


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 11:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Ich benutze SIGF_SINGLE, aber ausschließlich zum drauf warten. Vielleicht ist doch da etwas problematisch?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 11:36 Uhr

Thore
Posts: 2266
Nutzer
Hast Du das Signal gecleard mit
SetSignal(0L, SIGF_SINGLE);
bevor Du Wait aufrufst?
Außerdem sollte da das Programm nicht auf andere Signale warten. Sonst wirds problematisch (z.B. das Wait wacht auf und Single ist noch ausstehend)
Vorteil von Single ist wenn du nur auf ein Signal wartest, und es nicht vorher alloziieren willst (Single ist immer allocated)

[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 11:50 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Ja, hab ich gecleared. Was meinst Du mit "Wait wacht auf und Single ist noch ausstehend"? Geht das nicht, was ich mache?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 12:13 Uhr

Thore
Posts: 2266
Nutzer
Wenn dus richtig machst gehts schon.
Wenn Du auf mehrere Signale wartest, und auch auf das single Signal, kanns sein, daß ein anderes Signal auftritt, damit springt die Routine aus Wait.
Aber weil Du auch auf Single wartest, ist dieses Bit nicht gecleared, das macht das System hier nicht automatisch. Dieses Single Signal ist dann noch ausstehend.
Auf der Developer CD wird in den Mailings gut darauf eingegangen, was so passieren kann. Hier ist eine Online Kopie:
http://amigadev.elowar.com/read/ADCD_2.1/AmigaMail_Vol2_guide/node0089.html

[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 12:30 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Nein, das Signal ist nicht an der Instabilität schuld. Das kann höchstens daran schuld sein, das zu oft refreshed wird oder so.

Wenn es instabil ist (ich schliesse jetzt mal single-threaded programmierfehler aus), dann liegt es an einer sog. "Race-Condition", d.h. etwas stimmt in der Logiki mit den Semaphoren nicht.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 12:59 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Genau diesen Artikel hatte ich schon gelesen. Wobei, in dem Beispielsource dort wird auch auf SIGBREAKF_CTRL_F gewartet, aber nicht zum beenden eines Tasks sondern zum starten. Ist das genauso frei wie SIGF_SINGLE? Was ist evtl. der Unterschied?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

28.12.2011, 13:36 Uhr

Thore
Posts: 2266
Nutzer
Wenn du nur auf ein Signal warten willst, kannst Du Single nehmen. Wartest du auf bestimmte Signale (z.B. CTRL-C oder mehrere) nimmst du die anderen Signale. Im Grunde kannst Du auch auf Single verzichten. Aber mit Single-Core und Threadsafe hat das nichts direkt zu tun.
Machst Du was an den Signalen falsch, dann kanns sein daß einer nochmal wartet, oder nicht weiß daß ein bestimmtes Signal oder Ereignis bereits eingetreten ist. Abstürzen sollte es jedoch nicht.
Ich vermute vielmehr daß es an der Layout Routine liegt, aldo dem Rendern während du das Fenster veränderst.

[ - Antworten - Zitieren - Direktlink - ]

30.12.2011, 14:36 Uhr

AGSzabo
Posts: 1663
Nutzer
Nur mal so zum Verständnis: ein Sprung zu Wait() hebt doch ein vorangegangenes Forbid() auf, oder?
--
Author of Open eXternal User Interfaces - Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

30.12.2011, 16:01 Uhr

AGSzabo
Posts: 1663
Nutzer
Noch ein kleines Problem.

Der Parent-Process muss nach TC_Userdata des Child Prozesses einen Zeiger auf meine Globalen schreiben. Dazu macht der Parent Prozess im Moment vor CreateNewProc() ein Forbid() und dann nach dem Schreiben des Zeigers ein Permit(). In der Theorie ist das gut, in der Praxis ergeben sich manchmal sichtbare Einfrierzeiten, bis der neue Prozess gestartet ist.

Dem will ich wie folgt abhelfen: der Child Prozess wartet auf SIGF_SINGLE, welches vom Parent Prozess nach dem Schreiben des Zeigers ausgelöst wird. Das Problem: der Parent Prozess setzt das Signal noch bevor der Child-Prozess dieses löscht, um darauf zu warten. Somit bleibt der Child-Task in der Schwebe...

ps: ich habe das SIGF_SINGLE durch SIGBREAKF_CTRL_F ersetzt, das braucht nicht erst gelöscht zu werden. Das Forbid habe ich raus genommen, aber zefix, das System friert beim Start des Child Prozesses immernoch beim ersten mal ausführen des Programms einige Sekunden ein!

--
Author of Open eXternal User Interfaces - Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 30.12.2011 um 16:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

30.12.2011, 20:12 Uhr

thomas
Posts: 7718
Nutzer
@AGSzabo:

Warum, glaubst du, hat man AmigaOS von der ersten Stunde an Ports und Messages mitgegeben?

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]


1 -2- 3 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > filerequester task [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.