1 (изменено: InFlames, 2011-02-05 12:42:16)

Тема: AHK: UrlDownloadToFile работа в отдельном потоке

UrlDownloadToFile как я понял не может работать в отдельном потоке, т.е. скачивая файл через эту команду скрипт ждет завершения скачивания.

Делаю скачивание через таймер, но однако, когда происходит скачивание, скрипт стоит на месте.
По идее надпись xxx должна смениться на zzz через приблизительно 300мс, однако, она меняется, только после полного скачивания файла.
Для скачивания выбрал случайный ролик с onemove.ru. Его размер около 14мб, будьте осторожны у кого не безлимитный тариф.

Можно ли организовать скачивание в отдельном потоке?
На ум приходит только одно, через скрипт сформировать отдельный ahk скрипт, который скачает нужный файл, а затем в основном скрипте использовать скаченный файл.

   #Persistent
   gui, add, text, vtxt, xxx
   gui, show, w200 h200
   SetTimer, sub, -10
   OnExit, exitsub
   sleep 300
   GuiControl,,txt, zzz
   return
   
   sub:
    If FileExist(a_temp "\1.avi")
        FileDelete, %a_temp%\1.avi
    URLDownloadToFile
    ,http://onemove.ru/get/38241/
    , %a_temp%\1.avi
   return
    
    
   GuiEscape:
   GuiClose:
   ExitApp
   return
   
   exitsub:
       If FileExist(a_temp "\1.avi")
        FileDelete, %a_temp%\1.avi
        ExitApp
   return

2

Re: AHK: UrlDownloadToFile работа в отдельном потоке

InFlames пишет:

От сюда еще один вопрос:

Какой вопрос-то? В эту тему не заглядывали: UrlDownloadToFile - Timeout and Run In Background? Там вроде предлагают варианты решения.

3

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Отредактировал, забыл убрать лишнее. Сначала хотел спросить, может быть просто создавать отдельный ahk файл и запускать его через основной скрипт. Этот отдельный ahk файл скачивает нужный файл в temp.avi, а затем переименовывает его в File.avi. В это время основной скрипт постоянно следит за появлением файла File.avi

Спасибо за ссылку, сейчас почитаю.

4

Re: AHK: UrlDownloadToFile работа в отдельном потоке

По-моему, проще всего из второго скрипта послать сообщение окну первого по окончании закачки. А в первом поймать сообщение через OnMessage.

5

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Так и сделал. Только работает с PostMessage, с SendMessage не заработал.

OnMessage(0x5555,"Close")
OnExit, exitsub

;~ содержимое временного ahk файла
ahk =
(
DetectHiddenWindows, on
SetTitleMatchMode, 2
If FileExist(a_temp "\1.avi")
    FileDelete, %a_temp%\1.avi
URLDownloadToFile, http://onemove.ru/get/38241/, %a_temp%\1.avi
PostMessage, 0x5555,,,, 1.ahk ahk_class AutoHotkey
ExitApp
)
 
;~ запуск временного ahk файла
If FileExist(a_temp "\temp.ahk") 
    FileDelete, %a_temp%\temp.ahk
FileAppend, %ahk%, %a_temp%\temp.ahk
run %a_temp%\temp.ahk

gui, add, text, vtxt, xxx
gui, show, w200 h200
sleep 300
GuiControl,,txt, zzz
return
    
GuiEscape:
GuiClose:
   ExitApp
return
   
exitsub:
    If FileExist(a_temp "\1.avi")
    FileDelete, %a_temp%\1.avi
    ExitApp
return

Close()
{
    MsgBox Файл скачан
}

6

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Странно, у меня сработал и с SendMessage. А в чём проявилась неработа?

7 (изменено: InFlames, 2011-02-05 14:49:37)

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Не появлялось Msgbox, следовательно, сообщение не принимается.

Upd:
Сейчас попробовал этот скрипт с SendMessage, всё работает. Видимо я запускал какой-то промежуточный вариант и скрипт не срабатывал. Так что всё ок, можно менять на SendMessage. В данном случае это принципиально?

8

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Думаю, нет, раз Вас устраивает PostMessage. Раз второй скрипт не должен ждать ответа на своё сообщение, то PostMessage правильный выбор.

9

Re: AHK: UrlDownloadToFile работа в отдельном потоке

На самом деле всё решается двумя параллельными таймерами:

   #Persistent
   gui, add, text, vtxt, xxx
   gui, show, w200 h200
   SetTimer, sub, -10
   OnExit, exitsub
   SetTimer, Main, -10
   Return

sub:
    If FileExist(a_temp "\1.avi")
        FileDelete, %a_temp%\1.avi
    URLDownloadToFile
    ,http://onemove.ru/get/38241/
    , %a_temp%\1.avi
   return
   
Main:
   sleep 1000
   GuiControl,,txt, zzz
   Return
    
GuiEscape:
GuiClose:
   ExitApp
   
exitsub:
   If FileExist(a_temp "\1.avi")
      FileDelete, %a_temp%\1.avi
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Это как вариант.
А если у меня скрипт выполняет не только изменение xxx на zzz, а имеет много других функций, например, если я хочу двойным нажатием на значке в трее открывать окно Gui. Тоже делать таймером?

Просто я сталкнулся с такой проблемой:
запускается скрипт и в секции автозагрузки прописан код для скачивания файла
соответственно пока скачивается файл, скрипт стоит, и пытаясь открыть основное окно скрипта, это окно не всегда открывается сразу, т.к. скачивается файл.

11

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Вроде, никаких проблем:

   #Persistent
   SetTimer, sub, -10
   SetTimer, Main, -10
   OnExit, exitsub
   Return

sub:
   If FileExist(a_temp "\1.avi")
      FileDelete, %a_temp%\1.avi
   ToolTip Идёт скачивание!
   URLDownloadToFile, http://onemove.ru/get/38241/, %a_temp%\1.avi
   ToolTip
   MsgBox, Скачалось!
   return
   
Main:
   Menu, Tray, NoStandard
   OnMessage(0x404, "AHK_NOTIFYICON")
   gui, add, text, vtxt, xxx
   gui, show, w200 h200
   sleep 1000
   GuiControl,,txt, zzz
   Return
    
GuiEscape:
GuiClose:
   ExitApp
   
exitsub:
   If FileExist(a_temp "\1.avi")
      FileDelete, %a_temp%\1.avi
   ExitApp
   
AHK_NOTIFYICON(wParam, lParam)
{
   if lParam = 0x203      ; WM_LBUTTONDBLCLK := 0x203
      Gui, 2:Show, w100 h100
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Это уже подгонка кода под скачивание файла. А мне надо было подогнать скачивание файла под код. В любом случае за примеры спасибо.

13

Re: AHK: UrlDownloadToFile работа в отдельном потоке

А по какой причине команда UrlDownloadToFile может не работать? Вроде обновил, файрвол закрыл, а следующая команда ничего не качает:


UrlDownloadToFile, http://forum.script-coding.com/viewtopic.php?id=5472, C:\Temp\temp1.txt

14

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Работает, если создать папку Temp на диске C:\.

15

Re: AHK: UrlDownloadToFile работа в отдельном потоке

А я из Temp скрипт и запускал.

16

Re: AHK: UrlDownloadToFile работа в отдельном потоке

Тоже работает. Что из Темп, что не из Темп.