Seite 1 von 1

keine Rückmeldung beim Kopieren großer Dateien

Verfasst: 14.01.2013 17:05
von hth
Wenn ich in einer Schleife mit CopyFile() größere Videodateien kopiere, bringt Windows die Fehlermeldung "keine Rückmeldung"!
Ursache ist offensichtlich, dass

Code: Alles auswählen

While WindowEvent():Wend
dann längere Zeit nicht aufgerufen wird.

Wahrscheinlich muss ich Threads verwenden, oder?

hth

Re: keine Rückmeldung beim Kopieren großer Dateien

Verfasst: 14.01.2013 17:21
von ts-soft
Hier mal ein paar Möglichkeiten, mußte selber ausbaldovern, was für Dich passt :wink:
http://www.purebasic.fr/german/viewtopi ... 49#p271649
http://www.purebasic.fr/german/viewtopi ... 377#p97377
http://www.purebasic.fr/english/viewtop ... 20#p290420

Evtl. müssen die Sourcen noch leicht an die aktuelle PB Version angepasst werden.

Gruß
Thomas

Re: keine Rückmeldung beim Kopieren großer Dateien

Verfasst: 14.01.2013 17:34
von NicTheQuick
Ich hab dir mal was gebastelt, das automatisch die Kopieraktionen im Hintergrund ausführt. Ich hatte nur keine Zeit großartig Kommentare zu schreiben. Dafür ist aber ein Beispiel dabei.
Außerdem passt das hier nicht in die Windows-Rubrik, sondern eher in Allgemein. Ich verschieben den Thread also dorthin.

Code: Alles auswählen

EnableExplicit

Structure CopyFileFiles
	source.s
	dest.s
EndStructure
Structure CopyFileStruc
	hThread.i
	hSemaphore.i
	hMutex.i
	status.i
	List files.CopyFileFiles()
EndStructure
Procedure CopyFileThread(*cp.CopyFileStruc)
	Protected source.s, dest.s
	With *cp
		Repeat
			WaitSemaphore(\hSemaphore)
			LockMutex(\hMutex)
			If FirstElement(\files())
				source = \files()\source
				dest = \files()\dest
				DeleteElement(\files())
			EndIf
			\status = ListSize(\files()) + 1
			UnlockMutex(\hMutex)
			CopyFile(source, dest)
			LockMutex(\hMutex)
			\status = ListSize(\files())
			UnlockMutex(\hMutex)
		ForEver
	EndWith
EndProcedure

Procedure.i CopyFile_(SourceFileName.s, DestinationFileName.s)
	Static cp.CopyFileStruc
	
	With cp
		If Not \hMutex
			\hMutex = CreateMutex()
			If Not \hMutex : ProcedureReturn #False : EndIf
		EndIf
		If Not \hSemaphore
			\hSemaphore = CreateSemaphore()
			If Not \hSemaphore
				FreeMutex(\hMutex)
				ProcedureReturn #False
			EndIf
		EndIf
		If Not \hThread
			\hThread = CreateThread(@CopyFileThread(), @cp)
			If Not \hThread
				FreeSemaphore(\hSemaphore)
				FreeMutex(\hMutex)
				ProcedureReturn #False
			EndIf
		EndIf
		LockMutex(\hMutex)
		If AddElement(\files())
			\files()\source = SourceFileName
			\files()\dest = DestinationFileName
		EndIf
		\status = ListSize(\files())
		UnlockMutex(\hMutex)
		SignalSemaphore(\hSemaphore)
	EndWith
	
	ProcedureReturn @cp
	
EndProcedure

Macro CopyFile(SourceFileName, DestinationFileName)
	CopyFile_(SourceFileName, DestinationFileName)
EndMacro

Define *CopyFileStatus.CopyFileStruc

;Eigentlich muss der Rückgabewert von CopyFile() nur einmal ausgelesen werden. Er ändert sich nicht mehr.
;Man könnte also beim ersten oder zweiten mal den Rückgabewert ignorieren, bloß nicht bei beiden. ;)
*CopyFileStatus = CopyFile("/home/nicolas/Videos/test1.avi", "/home/nicolas/tmp/t1.avi")
*CopyFileStatus = CopyFile("/home/nicolas/Videos/test2.avi", "/home/nicolas/tmp/t2.avi")

While *CopyFileStatus\status
	Debug "Noch " + *CopyFileStatus\status + " Datei(en)."
	Delay(1000)
Wend

Debug "Fertig."