Ищу способ создать не глюченый дополнительный поток

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 20.09.2011 (Вт) 19:35

Начну с того, что проблема с дополнительным потоком, а именно - когда запускаю программу в бейсике, то все отлично работает. В Windows'e же вылетает ошибка "память не может быть read". Компиляция, конечно же P-code.
В программе за создание потока отвечает следующая строка NewThread1 = CreateThread(ByVal 0&, ByVal 0&, AddressOf DownloadInThread, ByVal 0&, CREATE_SUSPENDED, ThreadID) , кстати если таким же методом создать более простую процедуру, то в виндовсе все отлично работает. Ну а вообще, в конечном счете я добиваюсь того, чтобы файлы весом 1-50 кб, скачивались без зависания программы (1-2 секунды для меня критичны), например Качалка Темича "зависает" программу на 500-2000 мс, независимо от размера файла, и как я уже сказал, любые зависания в моем случае не пригодны. Может быть есть более подходящая для меня качалка? И еще хотел спросить, может вообще использовать получение файлов по ФТП ? И как закачки по фтп будут отражаться на "стойкости" программы. Спасибо.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 20.09.2011 (Вт) 23:46

Начал искать более тщательно и выяснил, что если в потоке будет находится declare api функция, то скомпиленные приложения не будут работать как надо. Увидел всего одну функцию в потоке (cslKachalka) - GetDesktopWindow , за ненадобностью убрал, но ситуация никак не изменилась, в проекте вообще нет ни одного объявления апи функции, соответственно совершенно непонятно в чем проблема.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 5:46

Ух ты, значит это кому-то нужно.
Почитай-ка, от начала до конца, особенно обращая внимание на мой самый большой пост.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 10:03

Хакер , большое спасибо, много интересного. Только вот из более большой темы, как раз с твоими объяснениями, для меня пока мало что ясно, маловат пока мой уровень, чтобы все понять. Кстати, я так понял, ты на тему многопоточности что-то интересное писать собирался, так вот можно узнать как продвигается проект? Я думаю, гладко работающая многопоточность в vb6 будет для многих актуальна.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 10:17

Я собрался написать кирпич, который позволит создать нормальный работающий поток.

Пока я его не написал, есть только такие варианты:
  • Написать его за меня.
  • Не использовать Declare, а использовать импорт через TLB
  • Писать код так, чтобы он не зависел от рантайма, а значит ничего не могло бы порушить поток.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 12:28

Написать его за меня.

Я бы с радостью, только вот знать бы еще что писать..
Не использовать Declare, а использовать импорт через TLB

Ты про CreateThread? Или вообще про все функции в программе (не в потоке) ?
Писать код так, чтобы он не зависел от рантайма, а значит ничего не могло бы порушить поток.

Вот это поинтересней. Можно подробнее о рантайме, и что вообще такое зависеть от рантайма? Единственное что я знаю, так это то, что рантайм переводится как время выполнения, получается не зависеть от времени выполнения? Как то несуразно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 13:48

Rody66 писал(а):Ты про CreateThread? Или вообще про все функции в программе (не в потоке) ?

Все функции, которые будут вызывать из нового потока.
Хотя я вот сейчас придумал: можно не только перенести импорт функции в TLB, можно оставить Declare-импорт, но перед тем, как функция будет вызвана из нового потока, нужно хоть раз вызвать функцию из основного потока. Но не всегда такой фиктивный вызов осуществим. И вот ещё придумал: если фиктивный вызов не подходит (или даже подходит, но ведь это по любому плохо, делать фиктивный вызов), можно ещё выполнить над функцией процедуру DFC-Discovery. Как это делается можно подглядеть в моём кирпиче «Вызов функций по указателю».

Rody66 писал(а):Вот это поинтересней. Можно подробнее о рантайме, и что вообще такое зависеть от рантайма? Единственное что я знаю, так это то, что рантайм переводится как время выполнения, получается не зависеть от времени выполнения? Как то несуразно.

Рантайм это библиотека msvbvm60.dll. Или msvbvm50.dll Или даже msvbvm61.dll, если когда-нибудь руки дойдут. Оттуда импортируются все функции вроде MsgBox, DoEvents или InputBox, но, что более важно, некоторые функции оттуда неявно используются по ходу дела.

Так вот, придерживаясь определённой несложной техники, можно писать код так, что никакого упоминания рантайма не будет. То есть ни одна из функций рантайма использована не будет. Такой код, например, можно безболезненно взять и скопировать в чужой процесс и выполнить там. Ну и естественно, что работая в новом потоке, такой код не спровоцирует крах, потому что крах провоцируют неявно вызываемые функции рантайма, которые надеятся обнаружить инициализированный контекст (о котором писал на другом форуме), но не обнаруживают.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 14:26

Все функции, которые будут вызывать из нового потока.

Дак в том то и дело, что у качалки от Темича всего одно объявление функции в его .cls и это GetDesktopWindow , которую я убрал, но ничего не изменилось. Я хорошо посмотрел, ни одного вызова WinAPI в потоке нет, но тем не менее, ошибка точно так же остается, что с апи, что без. Таким образом все последующее, что ты написал теряет смысл, ибо апи там попросту не используется. Кстати, там имело место быть глобальная переменная, ее тоже убрал, ситуация все та же.
Рантайм это библиотека msvbvm60.dll. Или msvbvm50.dll Или даже msvbvm61.dll, если когда-нибудь руки дойдут. Оттуда импортируются все функции вроде MsgBox, DoEvents или InputBox, но, что более важно, некоторые функции оттуда неявно используются по ходу дела.

Вот например простой цикл я выносил в новый поток, так вот там DoEvents во всю используется, и цикл отлично выполняется. Правда, должен сказать, что с DoEvents работает слегка криво, но все же работает.
Так вот, придерживаясь определённой несложной техники, можно писать код так, что никакого упоминания рантайма не будет.

Так если все берется из msvbvm60.dll , какой же это техники надо придерживаться, чтобы избежать использование всех функций в потоке? Тогда от такого потока и толку не будет вовсе. Мне такая техника не ясна.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 14:45

Rody66 писал(а):Так если все берется из msvbvm60.dll , какой же это техники надо придерживаться, чтобы избежать использование всех функций в потоке? Тогда от такого потока и толку не будет вовсе. Мне такая техника не ясна.

Очень грубо говоря: типы — только Long, Integer, Byte, функции — только из TLB.

Rody66 писал(а):Дак в том то и дело, что у качалки от Темича

А зачем она тебе вообще? Используй WinHTTP с флагом WINHTTP_FLAG_ASYNC, и не нужен будет доп. поток.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 16:22

Используй WinHTTP с флагом WINHTTP_FLAG_ASYNC, и не нужен будет доп. поток.

Хах, спасибище) Как все просто в итоге оказалось.
Как скачать файл разобрались, а вот на сервер закачать уже другая история.. Может быть есть какие-нибудь идеи, чтобы так же "асинхронно" ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 16:26

Закачать чем? Методом POST или речь вообще о FTP?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 17:07

Закачать чем? Методом POST или речь вообще о FTP?

Дак вот в том то и дело, что не знаю чем. Приоритет уходит скорости выполнения. То есть чем быстрее, тем лучше, ну и главное чтобы процесс не повисал. Только вот не представляю себе даже, как методом POST можно изменить файл на сервере (а мне буквально несколько символов надо в текстовике менять), с http технологиями не особо знаком.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Mikle » 21.09.2011 (Ср) 18:25

Хакер писал(а):Очень грубо говоря: типы — только Long, Integer, Byte, функции — только из TLB.

Я думал, что из основных типов только String завязан на рантайм (плюс всякие Decimal, Currency, Variant). Оказывается Single и Double тоже?
Уж больно шустро VB6, к примеру, матрицы перемножает, критического отставания от C++ нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 18:41

Mikle писал(а):Оказывается Single и Double тоже?

Ну первым часто просто манипулируют. Оттуда-то получили, туда-то передали. А где так обращаются с фп-числами? С ними обычно математику делают, а значит нужен __vbaFPException для обработки исключения. Впрочем, и для лонгов нужен __vbaErrorOverflow, если есть математика.

Разумеется, если переполнения нет, то всё отработает, но если вдруг будет, то оно улетит чёрти-куда.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Mikle » 21.09.2011 (Ср) 18:50

То есть, если исключить исключения (тавтология :) ), FP в таких потоках применять тоже можно? Речь о четырёх основных мат. операциях.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 19:03

Господа, вы, похоже, обо мне забыли..
Приоритет уходит скорости выполнения. То есть чем быстрее, тем лучше, ну и главное чтобы процесс не повисал. Только вот не представляю себе даже, как методом POST можно изменить файл на сервере (а мне буквально несколько символов надо в текстовике менять), с http технологиями не особо знаком.

Спасибо. :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение iGrok » 21.09.2011 (Ср) 19:23

Rody66 писал(а):Только вот не представляю себе даже, как методом POST можно изменить файл на сервере (а мне буквально несколько символов надо в текстовике менять), с http технологиями не особо знаком.

Оно и видно. :)

В общем-то, никак. Только целиком перекачивать. Думаю, в этом случае будет лучше сделать серверный скрипт, который будет этот файл менять как надо.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 19:30

Mikle писал(а):То есть, если исключить исключения (тавтология :) ), FP в таких потоках применять тоже можно? Речь о четырёх основных мат. операциях.


Лучше всё-таки подождать выхода кирпича. Если народ будет давить и я буду чувствовать, что это кому-то кроме меня нужно, я конечно сделаю быстрее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 20:16

Тогда слега перефразирую. Какой из способов фтп заливки не будет грузить процесс?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 20:45

Ты не сможешь с помощью ftp исправить маленький фрагмент. Придётся загружать весь файл. Лучше напиши скрипт, это верный путь, это правильный. Никакой способ не грузит процесс. Некоторые способы блокируют гуи-поток.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 21:02

Ты не сможешь с помощью ftp исправить маленький фрагмент. Придётся загружать весь файл.

ну когда файл весит <10 байт, то я думаю, не сложно и залить целиком, верно же?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение ger_kar » 21.09.2011 (Ср) 21:38

Хакер писал(а):Лучше всё-таки подождать выхода кирпича. Если народ будет давить и я буду чувствовать, что это кому-то кроме меня нужно, я конечно сделаю быстрее.
Оно, конечно нечасто, но бывает нужно, я почитал о том, как народ мучается изобретая многопоточность на VB и стал поглядывать в сторону PowerBasic, там и ассемблер встроенный есть и прочие интересности. Не знаю, как что-то большое, но небольшие программки на нем писать можно.
Rody66 писал(а):ну когда файл весит <10 байт, то я думаю, не сложно и залить целиком, верно же?
А в чем тогда вообще вопрос, не мегабайты же сотнями перегонять, при таком раскладе даже и заморачиваться не стоить.
Бороться и искать, найти и перепрятать

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 22:03

А в чем тогда вообще вопрос, не мегабайты же сотнями перегонять, при таком раскладе даже и заморачиваться не стоить.

Дело в том, что у меня есть подозрение на то, что процесс заливки на фтп даже самого минимального размера файла, на некоторое (для обычных программ незначительное) время, будет грузить форму (даже пол секунды для меня критичны), например вариант с асинхронной закачкой по средствам winhttp для меня идеально подходит, ибо использую его, вообще незаметно что что-то произошло, форма как тикала так и тикает без всяких сбоев (зависания я имею в виду). Так вот, вариантов работы с фтп, насколько я знаю не 1, поэтому у какого то должны быть свои плюсы и свои минусы. Вот в моем случае очень важен именно существования вышеописанной функции.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 22:12

Есть WinInet, который аналогичен WinHTTP, но включает в себя FTP- и другой функционал. Правда это настолько глючная вещь, что работать нужно очень осторожно, потому что реальной поведение функций отличается от того, что написано в документации.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 22:54

Есть WinInet, который аналогичен WinHTTP, но включает в себя FTP- и другой функционал. Правда это настолько глючная вещь, что работать нужно очень осторожно, потому что реальной поведение функций отличается от того, что написано в документации.

Ты о wininet.dll ? InternetOpen и тд.. Тогда поясни, пожалуйста, в чем эти глюки заключаются, на сколько они критичны, и как их можно избежать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 22:59

Я же дал ссылку. Там пара-тройка случаев. В общем, в таком духе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 21.09.2011 (Ср) 23:54

К счастью, к фтп это не причастно, поэтому едем дальше. Насчет функции все узнал, вроде все операция получаются. Но вот только с асинхронностью проблема. При закачке файлов, форма зависает на несколько секунд, если выставить флаг INTERNET_FLAG_PASSIVE , то ничего не изменяется и форма точно так же висит пока не запишется файл. В итоге получается так:
Код: Выделить всё
        hOpen = InternetOpen("API-Guide sample program", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
        hConnection = InternetConnect(hOpen, "your ftp server", INTERNET_DEFAULT_FTP_PORT, "your login", "your password", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
        Call FtpPutFile(hConnection, "c:\test.htm", "com/shared.txt", 1, 0)
        InternetCloseHandle hConnection
        InternetCloseHandle hOpen

Так как же все-таки закачивать на сервер полностью асинхронно?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 21.09.2011 (Ср) 23:58

Не форма, а окно, во-первых. И не висит, а не отвечает на оконные сообщения.

Причём тут INTERNET_FLAG_PASSIVE? Это вообще пассивный FTP, фича (подвид) протокола, режим работы самого протокола. Где тут пахнет асинхронностью?

Нигде не пахнет.

INTERNET_FLAG_ASYNC нужно использовать. Логично же, не правда ли?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Rody66 » 22.09.2011 (Чт) 0:11

INTERNET_FLAG_ASYNC нужно использовать. Логично же, не правда ли?

Более чем.
Делаю следующее:
Код: Выделить всё
hConnection = InternetConnect(hOpen, "", INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_ASYNC, 0)

Ситуация точно та же. Константу естественно объявил.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ищу способ создать не глюченый дополнительный поток

Сообщение Хакер » 22.09.2011 (Чт) 0:14

Что если прочитать внимательно описание флага?
INTERNET_FLAG_ASYNC
    0x10000000

    Makes only asynchronous requests on handles descended from the handle returned from this function. Only the InternetOpen function uses this flag.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Yandex-бот и гости: 14

    TopList