Seite 1 von 1

unbekannte Anzahl von Thread :synchronize()

Verfasst: Sa, 10. Jul 2010 4:00
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 ?

Re: unbekannte Anzahl von Thread :synchronize()

Verfasst: Sa, 10. Jul 2010 7:10
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

Re: unbekannte Anzahl von Thread :synchronize()

Verfasst: Sa, 10. Jul 2010 7:56
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 ...

Re: unbekannte Anzahl von Thread :synchronize()

Verfasst: Sa, 10. Jul 2010 9:32
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 !

Re: unbekannte Anzahl von Thread :synchronize()

Verfasst: Sa, 10. Jul 2010 10:17
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" !