unbekannte Anzahl von Thread :synchronize()

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

unbekannte Anzahl von Thread :synchronize()

Beitrag von AUGE_OHR »

hi,

ich habe doch versucht, bei rekusiven Verzeichnissen, jeweils einen neuen Thread zu starten.

wenn ich nur die Arrays von Directory() an ein "grosses" hinzufüge funktioniert es, aber wenn ich "on-fly" damit eine (activeX) Anweisung ausführen will kommen die Thread "durcheinander"

ich müsste die Thread also synchronisieren was kein Problem ist wenn ich "wenige" Thread habe

Code: Alles auswählen

DO WHILE .NOT. oThreadB:synchronize(1) 
   <Programm Code> 
ENDDO 
/* oder */ 
oThreadB:synchronize(0) 
aber wenn ich nun rekursive 20-30 Threads am laufen haben, wie synchronisieren ich die ?

Code: Alles auswählen

DO WHILE .NOT. ::allOthereThread(oNotMeThread):synchronize(1) 
   <Programm Code> 
ENDDO
/* oder */ 
::allOthereThread(oNotMeThread):synchronize(0) 
wie also müsste eine Methode ::allOthereThread(oNotMeThread) arbeiten ?
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: unbekannte Anzahl von Thread :synchronize()

Beitrag von Jan »

Jeder Thread hat ja eine eigene ID. Und Du kannst jedem Thread einen Namen geben. Kannst Du nicht bei jeder Erzeugung eines Threads die ID oder den Namen in ein Array schreiben, und das dann einfach abarbeiten?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: unbekannte Anzahl von Thread :synchronize()

Beitrag von brandelh »

Hallo Jimmy,

ich denke dass der Ansatz als solcher falsch ist.
Das Dateisystem (die Festplatte) kann nicht gleichzeitig viele Threads bedienen ohne sich gegenseitig zu behindern. Beim NEROCMD Aufruf gehe ich hin und kopiere zunächst alle Dateien in eine gewünschte Struktur in ein temporäres Verzeichnis. Dann übergebe ich ein Parameter, dass Nero alle Dateien aus diesem Verzeichnis inkl. aller Unterverzeichnisse brennen soll. Das geht schnell und gut, auch ohne Thread, da die Festplatte am liebsten "Am Stück" arbeitet.

Bei ActiveX müsste das doch auch einstellbar sein, dass Nero ein Verzeichnis komplett brennt, also ein Befehl statt jede Datei einzeln. Dann kümmert sich Nero intern darum und ist auch schnell ...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: unbekannte Anzahl von Thread :synchronize()

Beitrag von AUGE_OHR »

Jan hat geschrieben:Jeder Thread hat ja eine eigene ID. Und Du kannst jedem Thread einen Namen geben. Kannst Du nicht bei jeder Erzeugung eines Threads die ID oder den Namen in ein Array schreiben, und das dann einfach abarbeiten?
klar die ThreadID !!! Danke !
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: unbekannte Anzahl von Thread :synchronize()

Beitrag von AUGE_OHR »

brandelh hat geschrieben:ich denke dass der Ansatz als solcher falsch ist.
Das Dateisystem (die Festplatte) kann nicht gleichzeitig viele Threads bedienen ohne sich gegenseitig zu behindern.
ok mit HD oder "normalen" Netzwerk hast du Recht ... da kann man ja nicht "zusätzlich" noch einen Kanal aufmachen ...

ich wollte eigentlich nur "testen" ob das geht ... nicht unbedingt ob es in einer solchen Umgebung "Sinn" macht.
tatsächlich ist das rekursive Directory() viel schneller als die activeX Property FileSystemDescContainer:Name/Name2 zu setzten ...



Thread sind ja eine schöne Sache ... wenn man die unter Kontrolle hat.

Solange Threads auf verschiedene Objecte z.b. DBF arbeiten funktioniert es, aber wenn die auf gemeinsame arbeiten muss man die synchronisieren.
Bei activeX sind ja alle auf das selbe activeX bezogen und "sperren" kann das activeX ja nicht "automatisch".

deshalb hab überlegt wie man eine "unbekannte" Anzahl von Thread in Griff bekommen könnte.
brandelh hat geschrieben:Beim NEROCMD Aufruf gehe ich hin und kopiere zunächst alle Dateien in eine gewünschte Struktur in ein temporäres Verzeichnis. Dann übergebe ich ein Parameter, dass Nero alle Dateien aus diesem Verzeichnis inkl. aller Unterverzeichnisse brennen soll. Das geht schnell und gut, auch ohne Thread, da die Festplatte am liebsten "Am Stück" arbeitet.

Bei ActiveX müsste das doch auch einstellbar sein, dass Nero ein Verzeichnis komplett brennt, also ein Befehl statt jede Datei einzeln. Dann kümmert sich Nero intern darum und ist auch schnell ...
ich bin noch nicht ganz durch, aber "so" einfach war das doch nicht.

Man sollte erstmal wissen wie ein CD "aufgebaut" ist und welche Unterschiede es gibt.
::oBurner:BurnIsoAudioCD("MyVolume","",.F.,::oIsoTrack,NIL,NIL,::BurnFlag,INT(nWriteSpeed),::nNERO_MEDIA)
wäre eine Methode wie man sie für Audio und(!) Data Format XA-1 verwenden könnte.

Code: Alles auswählen

::oBurner:BurnFileSystemContent(::oFileSys,::BurnFlag,INT(nWriteSpeed),::nNERO_MEDIA)
::oFileSys ist nun ein "Container" der Daten von Directory() entgegen nimmt un zum "brennen" weitergibt.

Man muss Nero also erst mit activeX Objecten "füllen" bevor er was macht ;)

Hat man das nun geschafft und die Xbase++ Application "brennt" ... dann heisst das noch nicht das man die CD-RW auch "lesen" kann.
DAO oder TAO, ISO9600 oder Joliet, falsches "Book" Format (meint es wäre ein Audio-CD)

und wenn die "kleinen" Projekte sauber gebrannt werden ... was ist mit > 650 MB ?
:Overburn := .T. ist ratsam und auch der "richtige" Speed ... + BufferUnderrun ...

last but not least : Die Events von 2 Objecten gleichzeitig "auswerten" !
gruss by OHR
Jimmy
Antworten