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
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
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."