Войти

Показать полную графическую версию : Вставка прогресс бара в функцию


Страниц : 1 2 [3]

Creat0R
24-07-2009, 01:04
Одно НО, все эти функции один фиг не вызываются Hotkey в процессе копирования, который видимо занимает все активное процессорное время и не пускает в память никого. (Я про копирование NTFS). »
HotKeySet не обрабатывается до завершения callback-функции при копировании любого файла.

Пока решаю это просто ручным повторным открытием скрипта. »
Тогда могу предложить другой, похожий вариант - назначить HotKey в дополнительном скрипте, который будет работать в скрытом режиме, а используя интеракцию между скриптами дочерний скрипт сообщит родительскому что нужно завершать работу (это для корректной остановки копирования, однако не подходит для случая с прицепленным потоком NTFS), ну или сам завершит работу родителя, для этого нужно будет передавть при запуске скрипта PID родительского процесса (этот метод некорректен, но эффективен :) ).

Хм, забавно, на практике всё намного хуже чем я думал - дочерний скрипт тоже не обрабатывает HotKeySet пока процесс копирование не завершится :dont-know очень странный баг...

Creat0R
24-07-2009, 01:23
А что мешает использовать _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
А темка-то живет ! :)
Вот еще вопросец,
Как с помощью этой функции копировать файл с перетиранием системного и только для чтения ?
По умолчанию она не перетирает такие файлы.

Creat0R
24-07-2009, 17:17
А темка-то живет »
Темка может и живёт, а вот вопросики в ней уже пошли не в темку :)

Как с помощью этой функции копировать файл с перетиранием системного и только для чтения ? »
А почему бы просто не убрать атрибуты у файла (FileSetAttrib())?

11943499
24-07-2009, 18:40
А почему бы просто не убрать атрибуты у файла (FileSetAttrib())? »
Не допер до этого, чувствуется ход мысли истинного прграммера, спасибо! :ok:

crimes
06-04-2014, 17:59
Взял прогресс бар из этой темы:

Copy With Progress Example.au3
Copy_With_Progress_Incl.au3

Обеденил в один и с конвертировал его в "exe",теперь нужно сделать так:

Запуск будет через cmd\bat.
Copy-With.exe "C:\из" "D:\куда"

И ещё при копирование не доступен рабочий стол,если можно исправить это,так как копирование очень большое.

За ранее спасибо.

Iska
06-04-2014, 18:11
Взял … Обеденил … теперь нужно сделать так: »
Где Ваш «обеденённый» код?

crimes
06-04-2014, 18:40
Извеняюсь.

И если можно ещё его как то облегчить,и для общего понятия там файлов около 40гб файлы разные от 1 байта до 3гб.

Iska
06-04-2014, 20:46
теперь нужно сделать так:
Запуск будет через cmd\bat.
Copy-With.exe "C:\из" "D:\куда" »
Делайте: Running Scripts — Command Line Parameters (http://www.autoitscript.com/autoit3/docs/intro/running.htm#CommandLine).

И ещё при копирование не доступен рабочий стол, »
Не подтверждаю. Доступен.

crimes
06-04-2014, 21:11
Не подтверждаю. Доступен. »

Это если напрямую запускать скрипт ".au3",а если через батник,то батник заблокирован,но раб. стол активен.(Но пойдёт и так.)

Спасибо!
$Title = "Копирование..."

$Source = $CmdLine[1]
$Dest = $CmdLine[2]


И ещё можете помочь в этой теме,последнее сообщение.
http://forum.oszone.net/thread-244893.html

Только желательно готовый вариант.

Iska
06-04-2014, 23:56
Это если напрямую запускать скрипт ".au3",а если через батник,то батник заблокирован,но раб. стол активен.(Но пойдёт и так.) »
В переводе на русский — «окно консоли пакетного файла остаётся открытым, пока не будет завершено исполнение скомпилированного скрипта AutoIt». К AutoIt, собственно, отношения не имеет. Решение:
start /?

crimes
07-04-2014, 00:19
В переводе на русский — «окно консоли пакетного файла остаётся открытым »

Сокращённо cmd\bat.

Вообще речи и шла на прямой запуск "тогда рабочий стол блокируеться",в друг буду и напрямик пользоваться.

А через cmd можно и так,но это не важно,главное уже решено,вы мне в другой теме лучше помогите.

http://forum.oszone.net/thread-244893.html

Ещё раз спасибо.




© OSzone.net 2001-2012