Показать полную графическую версию : Вставка прогресс бара в функцию
Одно НО, все эти функции один фиг не вызываются Hotkey в процессе копирования, который видимо занимает все активное процессорное время и не пускает в память никого. (Я про копирование NTFS). »
HotKeySet не обрабатывается до завершения callback-функции при копировании любого файла.
Пока решаю это просто ручным повторным открытием скрипта. »
Тогда могу предложить другой, похожий вариант - назначить HotKey в дополнительном скрипте, который будет работать в скрытом режиме, а используя интеракцию между скриптами дочерний скрипт сообщит родительскому что нужно завершать работу (это для корректной остановки копирования, однако не подходит для случая с прицепленным потоком NTFS), ну или сам завершит работу родителя, для этого нужно будет передавть при запуске скрипта PID родительского процесса (этот метод некорректен, но эффективен :) ).
Хм, забавно, на практике всё намного хуже чем я думал - дочерний скрипт тоже не обрабатывает HotKeySet пока процесс копирование не завершится :dont-know очень странный баг...
А что мешает использовать _IsPressed? Оно нормально проверяется и срабатывает.
#include <Misc.au3>
Global Const $PROGRESS_CONTINUE = 0
Global Const $PROGRESS_CANCEL = 1
Global Const $PROGRESS_STOP = 2
Global Const $PROGRESS_QUIET = 3
Global $hDll = DllOpen("User32.dll")
_FileCopyEx("E:\Downloads\Video.avi", "D:\Dest\Video.avi", 8+1)
Func _FileCopyEx($sSource, $sDest, $iFlags=0)
If Not FileExists($sSource) Then Return SetError(1)
ProgressOn("_FileCopyEx() Demo", "Копирование файла...")
Local $sFileName = StringRegExpReplace($sSource, "^.*\\", "")
Local $sFilePath = StringRegExpReplace($sDest, "\\[^\\]*$", "")
If Not BitAND($iFlags, 1) And FileExists($sDest) Then
ProgressSet(0, "Ошибка копирования файла (" & $sFileName & "):" & @CRLF & "* Перезапись файла не разрешена")
Sleep(2000)
ProgressOff()
Return SetError(2)
EndIf
If (BitAND($iFlags, 8) And Not DirCreate($sFilePath)) Or (Not StringInStr(FileGetAttrib($sFilePath), "D")) Then
ProgressSet(0, "Ошибка копирования файла (" & $sFileName & ")" & @CRLF & "* Не найдена папка назначения")
Sleep(2000)
ProgressOff()
Return SetError(3)
EndIf
Local $hCopyProgressRoutine = DllCallbackRegister("_CopyProgressRoutine", "int", _
"uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;str")
Local $aRet = DllCall("Kernel32.dll", "int", "CopyFileExA", _
"str", $sSource, _
"str", $sDest, _
"ptr", DllCallbackGetPtr($hCopyProgressRoutine), _
"str", $sFileName, _
"int", 0, _
"int", 0)
DllCallBackFree($hCopyProgressRoutine)
Sleep(1000)
ProgressOff()
Return 1
EndFunc
Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
Local $iPrecent = $TotalBytesTransferred/$TotalFileSize * 100
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " %", "Копирую: " & $lpData)
;Abort on "Ctrl + Shift + A"
If _IsPressed("10", $hDll) And _IsPressed("11", $hDll) And _IsPressed("41", $hDll) Then
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " % (Прервано пользователем)")
Sleep(1000)
Return ProcessClose(@AutoItPID)
;Return $PROGRESS_CANCEL
EndIf
Return $PROGRESS_CONTINUE
EndFunc
11943499
24-07-2009, 13:04
А что мешает использовать _IsPressed? Оно нормально проверяется и срабатывает. »
Согласен, мне этот способ тоже больше нравится, видимо он обрабатывает нажатия на более глубинном уровне.
11943499
24-07-2009, 16:51
А темка-то живет ! :)
Вот еще вопросец,
Как с помощью этой функции копировать файл с перетиранием системного и только для чтения ?
По умолчанию она не перетирает такие файлы.
А темка-то живет »
Темка может и живёт, а вот вопросики в ней уже пошли не в темку :)
Как с помощью этой функции копировать файл с перетиранием системного и только для чтения ? »
А почему бы просто не убрать атрибуты у файла (FileSetAttrib())?
11943499
24-07-2009, 18:40
А почему бы просто не убрать атрибуты у файла (FileSetAttrib())? »
Не допер до этого, чувствуется ход мысли истинного прграммера, спасибо! :ok:
Взял прогресс бар из этой темы:
Copy With Progress Example.au3
Copy_With_Progress_Incl.au3
Обеденил в один и с конвертировал его в "exe",теперь нужно сделать так:
Запуск будет через cmd\bat.
Copy-With.exe "C:\из" "D:\куда"
И ещё при копирование не доступен рабочий стол,если можно исправить это,так как копирование очень большое.
За ранее спасибо.
Взял … Обеденил … теперь нужно сделать так: »
Где Ваш «обеденённый» код?
Извеняюсь.
И если можно ещё его как то облегчить,и для общего понятия там файлов около 40гб файлы разные от 1 байта до 3гб.
теперь нужно сделать так:
Запуск будет через cmd\bat.
Copy-With.exe "C:\из" "D:\куда" »
Делайте: Running Scripts — Command Line Parameters (http://www.autoitscript.com/autoit3/docs/intro/running.htm#CommandLine).
И ещё при копирование не доступен рабочий стол, »
Не подтверждаю. Доступен.
Не подтверждаю. Доступен. »
Это если напрямую запускать скрипт ".au3",а если через батник,то батник заблокирован,но раб. стол активен.(Но пойдёт и так.)
Спасибо!
$Title = "Копирование..."
$Source = $CmdLine[1]
$Dest = $CmdLine[2]
И ещё можете помочь в этой теме,последнее сообщение.
http://forum.oszone.net/thread-244893.html
Только желательно готовый вариант.
Это если напрямую запускать скрипт ".au3",а если через батник,то батник заблокирован,но раб. стол активен.(Но пойдёт и так.) »
В переводе на русский — «окно консоли пакетного файла остаётся открытым, пока не будет завершено исполнение скомпилированного скрипта AutoIt». К AutoIt, собственно, отношения не имеет. Решение:
start /?
В переводе на русский — «окно консоли пакетного файла остаётся открытым »
Сокращённо cmd\bat.
Вообще речи и шла на прямой запуск "тогда рабочий стол блокируеться",в друг буду и напрямик пользоваться.
А через cmd можно и так,но это не важно,главное уже решено,вы мне в другой теме лучше помогите.
http://forum.oszone.net/thread-244893.html
Ещё раз спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.