Показать полную графическую версию : Вставка прогресс бара в функцию
11943499
20-07-2009, 22:57
Вот похожая функция, бнемного облегченная, с одним прогрессбаром.
_FileCopyEx($Source, $Dest)
Одно плохо, процесс копирования нельзя отменить. Уважаемые знатоки, подскажите, как добавить клавишу отмены копирования.
С правкой тела функций разумеется.
Спасибо.
Func _FileCopyEx($sSource, $sDest)
If Not FileExists($sSource) Then Return SetError(1)
ProgressOn("Идет копирование","","",@DesktopWidth-320,@DesktopHeight-181,2)
Local $hCopyProgressRoutine = DllCallbackRegister("_CopyProgressRoutine", "int", _
"uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr")
DllCall("kernel32.dll", "int", "CopyFileExA", _
"str", $sSource, _
"str", $sDest, _
"ptr", DllCallbackGetPtr($hCopyProgressRoutine), _
"ptr", 0, _
"int", 0, _
"int", 0)
DllCallBackFree($hCopyProgressRoutine)
Sleep(1000)
ProgressOff()
EndFunc
Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
Local $iPrecent = $TotalBytesTransferred/$TotalFileSize * 100
ProgressSet($iPrecent, "Выполнено " & Round($iPrecent, 1) & " %")
EndFunc
11943499,
Куски кода заключайте в соот-вующие теги.
процесс копирования нельзя отменить »
Можно, если это конечно не тот же вопрос что был на руборде, тогда вы снова упускаете важные детали при постановке вопроса :)
11943499
21-07-2009, 00:54
Можно, если это конечно не тот же вопрос что был на руборде, тогда вы снова упускаете важные детали при постановке вопроса »
Постановка проста,
есть работающая функция копирования с прогрессбаром. Компильнул и пользуешься. Не хватает клавиши или кнопки отмены.
Использование горячей клавиши не идет, или запускающая ею функция не корректна для прерывания прогрессбара.
Умнее чем ProgressOff ( ) не накопал, нл оно не работает. Вот такие важные детали. :)
есть работающая функция копирования с прогрессбаром. Компильнул и пользуешься. Не хватает клавиши или кнопки отмены. »
мне это только кажется или на ру-борде этот вопрос в тот раз еще не решили?
опять же, идея все та же - нарисовать окно, в нем пргресс бар, прикрутить эту функцию (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=2040#14) и вставить кнопку отмена (http://forum.ru-board.com/topic.cgi?forum=5&topic=29240&start=1620#5)
Creat0R, а ты не делал пример на с отменой? что то было кажется, да найти не могу...
Постановка проста »
Ну посмотрим:
#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\Some big file.avi", "C:\Some big file.avi")
Func _FileCopyEx($sSource, $sDest)
If Not FileExists($sSource) Then Return SetError(1)
ProgressOn("_FileCopyEx() Demo", "Копирование файла: " & StringRegExpReplace($sSource, "^.*\\", ""))
Local $hCopyProgressRoutine = DllCallbackRegister("_CopyProgressRoutine", "int", _
"uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr")
DllCall("Kernel32.dll", "int", "CopyFileExA", _
"str", $sSource, _
"str", $sDest, _
"ptr", DllCallbackGetPtr($hCopyProgressRoutine), _
"ptr", 0, _
"int", 0, _
"int", 0)
DllCallBackFree($hCopyProgressRoutine)
Sleep(1000)
ProgressOff()
EndFunc
Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
Local $iPrecent = $TotalBytesTransferred/$TotalFileSize * 100
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " %")
If _IsPressed("1B", $hDll) Then
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " % (Прервано пользователем)")
Return $PROGRESS_CANCEL
EndIf
Return $PROGRESS_CONTINUE
EndFunc
Использование горячей клавиши не идет, или запускающая ею функция не корректна для прерывания прогрессбара. »
По HotKeySet да, оно не сработает, видимо это из за повторного использования механизма callbak (HotKeySet это тоже своего рода callback).
ты не делал пример на с отменой? »
Только его направляющую часть (http://forum.ru-board.com/topic.cgi?forum=5&topic=29240&start=1580#17) ;)
Только его направляющую часть »
значит на досуге надо собраться нам и сделать ....а то чувствую это тема доооооооооооооооооолго тянется )
значит на досуге надо собраться нам и сделать »
Что сделать? Я же выше привёл рабочий вариант. Кроме прочего, поискать можно и найти кучу подобных решении, у меня в базе скриптов как минимум штук 5 есть.
11943499
21-07-2009, 08:19
Что сделать? Я же выше привёл рабочий вариант. »
Вариант рабочий, но на практике не очень. На ruborde я писал про копирование NTFS потоков, это было ошибочное заявление, там пробовал Hotkey-ем тормозить процесс, и вроде срабатывало на FAT32, но на самом деле та же история. Лучшее что происходит, так это зависание процесса копирования. Спасибо за проявленный интерес, когда гуру собираются вместе, как-то спокойно и светло на душе становится... :)
Вариант рабочий, но на практике не очень. На ruborde я писал про копирование NTFS потоков, это было ошибочное заявление, там пробовал Hotkey-ем тормозить процесс, и вроде срабатывало на FAT32, но на самом деле та же история. »
Так в чём собственно непрактичность примера?
11943499
21-07-2009, 10:01
Так в чём собственно непрактичность примера? »
да все хорошо, но не работает...
Процесс копирования виснет, а не закрывается.
Процесс копирования виснет, а не закрывается »
Какая система и версия AutoIt?
11943499
21-07-2009, 19:10
Какая система и версия AutoIt? »
Windows 7 X64 и XP Prof SP3
Autoit последний
Windows 7 X64 и XP Prof SP3 »
Не знаю, у меня на XP SP2 hf,jnftn (Fat32). См. MSDN (http://msdn.microsoft.com/en-us/library/aa363852(VS.85).aspx) для подробностей.
11943499
22-07-2009, 01:23
Виснет именно при копировании файла с прицепленным потоком NTFS.
Об этом уже говорили на Ruboard, получается этот процесс в принципе непрерываем.
Отстегивание и пристегивание скрытого потока не пойдет, чревато потерями данных...
Виснет именно при копировании файла с прицепленным потоком NTFS »
А я ведь писал:
Можно, если это конечно не тот же вопрос что был на руборде, тогда вы снова упускаете важные детали при постановке вопроса »
этот процесс в принципе непрерываем »
При копировании через Windows, можно отменить этот процесс? значит и через скрипт можно, нужно просто покапаться поглубже. Кстати если нужно, есть пример для копирования именно с отображением системного диалога.
11943499
22-07-2009, 08:47
При копировании через Windows, можно отменить этот процесс? »
Да, Винда процесс прерывает, но Total Comander и Far не могут :) Они выдают сообщение что процесс отменен и продолжают копировать.
Кстати если нужно, есть пример для копирования именно с отображением системного диалога. »
Буду благодарен. Надо как-то разобраться, а то застрял на ерунде...
Буду благодарен »
_FileCopy("E:\Downloads\Video.avi", "C:\Dest\")
Func _FileCopy($sSource, $sDest, $iShowConfirm=1, $iShowProgress=1)
Local Const $FOF_RESPOND_YES = 64
Local Const $FOF_NOCONFIRMATION = 16
Local Const $FOF_SIMPLEPROGRESS = 256
Local $iFlags = 0
If $iShowConfirm = 0 Then $iFlags = BitOR($iFlags, $FOF_NOCONFIRMATION)
If $iShowProgress <> 0 Then $iFlags = BitOR($iFlags, $FOF_SIMPLEPROGRESS)
Local $sDest_Path = StringRegExpReplace($sDest, "\\[^\\]*$", "")
If Not StringInStr(FileGetAttrib($sDest_Path), "D") Then DirCreate($sDest_Path)
Local $oShell = ObjCreate("Shell.Application")
Local $oNameSpace = $oShell.NameSpace($sDest)
$oNameSpace.CopyHere($sSource, $iFlags)
EndFunc
Func _FileMove($sSource, $sDest, $iShowConfirm=1, $iShowProgress=1)
Local Const $FOF_RESPOND_YES = 64
Local Const $FOF_NOCONFIRMATION = 16
Local Const $FOF_SIMPLEPROGRESS = 256
Local $iFlags = 0
If $iShowConfirm = 0 Then $iFlags = BitOR($iFlags, $FOF_NOCONFIRMATION)
If $iShowProgress <> 0 Then $iFlags = BitOR($iFlags, $FOF_SIMPLEPROGRESS)
Local $sDest_Path = StringRegExpReplace($sDest, "\\[^\\]*$", "")
If Not StringInStr(FileGetAttrib($sDest_Path), "D") Then DirCreate($sDest_Path)
Local $oShell = ObjCreate("Shell.Application")
Local $oNameSpace = $oShell.NameSpace($sDest)
$oNameSpace.MoveHere($sSource, $iFlags)
EndFunc
11943499
23-07-2009, 21:26
В свете разработок по закрытию дубля программы, нашел способ прерывать ЛЮБОЙ процесс копирования :unsure:
Для прерывания процесса достаточно запустить скрипт из самого себя. Происходит дубль открытия, процессы гасятся, копирование прекращается. :)
Для прерывания процесса достаточно запустить скрипт из самого себя. Происходит дубль открытия, процессы гасятся, копирование прекращается. »
Что-то тут нелогично, как повторный запуск скрипта влияет на процесс первого скрипта (если он конечно его сам и не закрывает)?
Если уже на то пошло (“гашение” процесса копирование), то почему бы просто не указать скрипту закрывать самого себя?
ProcessClose(@AutoItPID)
:)
11943499
24-07-2009, 00:02
Что-то тут нелогично, как повторный запуск скрипта влияет на процесс первого скрипта (если он конечно его сам и не закрывает)? »
Я использую функцию закрытия всех пидов с имемем скрипта, так что закрываются все близнецы.
Если уже на то пошло (“гашение” процесса копирование), то почему бы просто не указать скрипту закрывать самого себя? »
Это еще круче, не знал про такую возможность.
Одно НО, все эти функции один фиг не вызываются Hotkey в процессе копирования, который видимо занимает все активное процессорное время и не пускает в память никого. (Я про копирование NTFS). Пока решаю это просто ручным повторным открытием скрипта.
Все же есть особенности в копировании системным способом и программным. Даже Total Comander не отменяет такого копирования.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.