Класс для копирования в отдельном потоке

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Класс для копирования в отдельном потоке

Сообщение The trick » 11.03.2014 (Вт) 11:44

Бывает ситуация, когда нужно скопировать большой файл(ы), при этом стандартная ф-ция FileCopy вешает всю программу до тех пор, пока не закончится копирование. Я разработал класс, в котором используется возможности ф-ции CopyFileEx (использовал ANSI версию), отображение прогресса копирования и возможности отмены, а также многопоточность для запуска всех функций в фоновом потоке. При запущенном процессе копирования, нельзя останавливать среду кнопкой стоп, только закрытием (нужно обязательно вызывать деструктор класса), иначе возможны глюки. Также желательно не запускать одновременно копирование большого количества файлов т.к. на каждое копирование создается отдельный поток, и при большом их количестве будут тормоза. Для отдельного потока использовал ассемблерную вставку со следующим кодом:
Код: Выделить всё
; Основная функция вызываемая в новом потоке при копировании
Copy:
     xor eax,eax     ; eax <- 0
     push eax        ; Локальная переменная pbCancel
     mov ecx,esp     ; Сохраняем адрес переменной
     push eax        ; dwCopyFlags
     push ecx            ; Указатель на pbCancel
     push eax        ; lpData
     push 0x0        ; lpProgressRoutine
     push 0x0        ; lpNewFileName
     push 0x0        ; lpExitingFileName
     call 0x0        ; Вызов CopyFileEx
     mov dword [0],eax   ; Возвращаемое значение
     xor eax,eax     ; dwExitCode
     call 0x0        ; Вызов ExitThread
; Функция обратного вызова CopyProgressRoutine
CopyProgressRoutine:
     fild qword [esp+12]     ; LARGE_INTEGER в вещественное число TotalBytesTransferred
     fild qword [esp+4]  ; LARGE_INTEGER в вещественное число TotalFileSize
     fdivp           ; делим на TotalFileSize
     fstp dword [0]      ; Сохраняем в переменную
     mov eax, dword [0]  ; Возвращаемое значение
     ret 0x34

Вместо нулей, вписываются данные походу в процедурах LoadStaticValue - это те, которые не будут изменяться и LoadDynamicValue - это имена файлов. Использовать класс можно и один для нескольких копирований или же несколько для одновременного копирования.
Изображение
У вас нет доступа для просмотра вложений в этом сообщении.
UA6527P

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList