|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть ряд вопросов по использованию TrickMultithreading.dll , разработанную ATM-TURBO 2 и любезно им пред- и предоставленную и обсуждаемую в "Многопоточность на VB6" 17700171 У меня в разработке проект, использующий несколько сторонних библиотек - как подключаемых, так и экспортирующих функции и активно использующих колбэки. В ключевом месте проекта применяется трединг со всеми вытекающими отсюда проблемами в IDE - постоянные падения при закрытии формы, невозможность отладки, код, захламленный выводами в логи, etc. Разрабатывать очень тяжело, но, слава богу, exe работает, тьфу-тьфу, нормально. Итак, вот скелетик моего приложения: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
А вот - проблемы: 1. ATM-TURBO 2, первое, что я не сумел сделать - зареференсить к своему проекту ни TrickMultithreading.dll, ни EXEInitialize.tlb, ни через IDE, ни через regsvr32. ЧЯДНТ? И нужно ли это, если dll заработала и без этого. Но ... 2. ... Заработала она только в IDE. Скомпилировав проект в exe, я получил: Код: plaintext 1.
Обработчик ошибок в процедуре вызова [vb]CreateThread пока не стоит, а логи показывают, что до вызова callback-процедуры дело не доходит, а он должен происходить сразу после создания потока. 3. Чтобы снивелировать п.2 я установил на свою форму галку, чтобы можно было выбирать механизм трединга - твой или мелкософтовский. Заработало :) 4. MsgBox "Multithreading not working in IDE" Я его вижу в modMultiThreading.bas. Посоветуй, как его правильнее отключить? А лучше - чтобы он сам определял - в IDE мы находимся или нет и, соответственно, делал выбор. И как, с какими параметрами, потом заново скомпилировать DLL? . ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 12:03 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Привет. Mina Anna Mazzini1. ATM-TURBO 2, первое, что я не сумел сделать - зареференсить к своему проекту ни TrickMultithreading.dll, ни EXEInitialize.tlb, ни через IDE, ни через regsvr32. ЧЯДНТ? И нужно ли это, если dll заработала и без этого. Но ... Если не хочешь юзать DLL то нужно подключить модуль modMultiThreading и в референсах EXEInitialize.tlb . Если хочешь юзать DLL (в целях отладки, дабы не загромождать проект модулями и библиотеками типов) - просто декларируй vbCreateThread: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Ничего подключать не нужно. Нужно только чтобы DLL лежала в том месте где будет происходить поиск DLL при загрузке . Mina Anna Mazzini2. ... Заработала она только в IDE. Скомпилировав проект в exe, я получил: Код: plaintext 1.
Обработчик ошибок в процедуре вызова [vb]CreateThread пока не стоит, а логи показывают, что до вызова callback-процедуры дело не доходит, а он должен происходить сразу после создания потока. Это может зависеть от миллиона факторов. Описание ошибки соответствует тому, что ты обращаешься к методу объекта кторого нет. (возможно это локальная переменная одного потока и ты ее передаешь в другой или что-то еще. Вообще ссылку между потоками нельзя передавать без маршаллинга. Mina Anna Mazzini3. Чтобы снивелировать п.2 я установил на свою форму галку, чтобы можно было выбирать механизм трединга - твой или мелкософтовский. Заработало :) Что за мелкосовтовский трединг? Mina Anna Mazzini4. MsgBox "Multithreading not working in IDE" Я его вижу в modMultiThreading.bas. Посоветуй, как его правильнее отключить? А лучше - чтобы он сам определял - в IDE мы находимся или нет и, соответственно, делал выбор. И как, с какими параметрами, потом заново скомпилировать DLL? . Ну вообще он сам определяет. Так ты компилируешь DLL, а не EXE? В DLL этот метод не будет работать. Для DLL есть другой метод. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 16:04 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
ATM-TURBO 2Если хочешь юзать DLL ... Да, именно так я изначально и сделал. И - спасибо за полезную ссыль. ATM-TURBO 2Mina Anna Mazzini3. Чтобы снивелировать п.2 я установил на свою форму галку, чтобы можно было выбирать механизм трединга - твой или мелкософтовский. Заработало :) Что за мелкосовтовский трединг? Ну, стандартный, который все применяют: Код: vbnet 1.
Я это объявление оставил, а в месте вызова сделал: Код: vbnet 1. 2. 3. 4. 5. 6.
ATM-TURBO 2Mina Anna MazziniRun-time error '91': Это может зависеть от миллиона факторов. Описание ошибки соответствует тому, что ты обращаешься к методу объекта кторого нет. (возможно это локальная переменная одного потока и ты ее передаешь в другой или что-то еще. Вообще ссылку между потоками нельзя передавать без маршаллинга.Может я невнятно изложил... Когда в своем проекте я задекларировал vbCreateThread и встроил переключение между ним и стандартным, я скомпилировал exe. Так в IDE vbCreateThread работает без нареканий. А в exe - вот эта ошибка :( В случае с MS CreateThread ситуация обратная - exe работает прекрасно, а IDE падает после закрытия формы. Поэтому мне и понадобился этот переключатель - разрабатываю я под твоей dll, а exe проверяю с MS :) Сейчас скомпилировал в P-Code - но та же ошибка и вместе с ним второе окно вылезло: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
ATM-TURBO 2Mina Anna Mazzini4. MsgBox "Multithreading not working in IDE" Я его вижу в modMultiThreading.bas. Посоветуй, как его правильнее отключить? А лучше - чтобы он сам определял - в IDE мы находимся или нет и, соответственно, делал выбор. И как, с какими параметрами, потом заново скомпилировать DLL? . Ну вообще он сам определяет. Так ты компилируешь DLL, а не EXE? В DLL этот метод не будет работать. Для DLL есть другой метод. Я компилирую EXE. Это десктопное приложение. Просто, когда я будучи в IDE, работаю, используя твою vbCreateThread, она меня постоянно предупреждает о том, что я в IDE, а я с ней постоянно соглашаюсь, что готов работать в одном потоке. Заколебывает немного :) ATM-TURBO 2Если не хочешь юзать DLL то нужно подключить модуль modMultiThreading и в референсах EXEInitialize.tlb .Если бы я мог подключить EXEInitialize.tlb , то я бы добавил твой модуль modMultiThreading.bas вместо объявления функции из DLL, а в нем (в модуле) закомментил бы вывод этого сообщения, но он (EXEInitialize.tlb) у меня не подключается :( . ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 20:50 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Везде, где я пишу "скомпилировал" - речь идет о моем проекте. Твою библиотеку и ее код я не трогаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 20:53 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Mina Anna Mazzini, автор А в exe - вот эта ошибка Скинь EXE либо простейший проект где такое наблюдается. Я не смогу сказать в чем проблема пока не увижу проект или код. авторСейчас скомпилировал в P-Code - но та же ошибка и вместе с ним второе окно вылезло: В P-Code это не работает я думаю (не проверял). авторПросто, когда я будучи в IDE, работаю, используя твою vbCreateThread, она меня постоянно предупреждает о том, что я в IDE, а я с ней постоянно соглашаюсь, что готов работать в одном потоке. Заколебывает немного :) Нужно будет просто сделать запоминание. Как нибудь сделаю. авторЕсли бы я мог подключить EXEInitialize.tlb, то я бы добавил твой модуль modMultiThreading.bas вместо объявления функции из DLL, а в нем (в модуле) закомментил бы вывод этого сообщения, но он (EXEInitialize.tlb) у меня не подключается :( Если не подключается, значит в реестре нужно почистить. Найди в реестре запись {0000000E-0000-0000-0300-000000003AAB} и удали ее. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 22:09 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
ATM-TURBO 2Если не подключается, значит в реестре нужно почистить. Найди в реестре запись {0000000E-0000-0000-0300-000000003AAB} и удали ее. Нет у меня в реестре ничего похожего. Единственный ключ: Код: plaintext
Странно... Запустил oleview.exe , посмотрел для любопытства. Потом что-то тыркал взад-вперед свой проект. Дай думаю, попробую еще раз зареференсить - подхватилось. Правда я спартизанил - с другой папки пробовал. Раскомментировал твой модуль modMultiThreading.bas , закомментировал декларацию TrickMultithreading.dll и все запустилось. Йез-з! ATM-TURBO 2... она меня постоянно предупреждает... Заколебывает немного Нужно будет просто сделать запоминание. Как нибудь сделаю.Да, было бы неплохо запоминать, но куда? Какой-то параметр ей передавать при вызове, может?... Прицепить в хвостике вызова :) С другой стороны - у тебя параметры удобно-красиво-идентичны с мелкософтовским вызовом - мозг напрягать и оговаривать отдельно не надо. ATM-TURBO 2Скинь EXE либо простейший проект где такое наблюдается. Я не смогу сказать в чем проблема пока не увижу проект или код.Спасибо за предлождение. Я подумаю - как от него поотрезать все лишнее. А сейчас в новой концепции - без DLL с твоим VB-модулем - покодю, наработаю новых ошибок и вопросов :) Пусть устаканится. . ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 23:03 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Ага. Теперь в реестре появился: Код: plaintext
Спасибо огромное за помощь. Только я не прощаюсь ;) Скажи, вот по этому твоему проекту: http://www.cyberforum.ru/blogs/354370/blog3511.html Где лучше задать вопросы? Там или здесь? Лучше, если здесь, я новую тему создам - с меня станется :) А то у меня: не взлетает Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 23:19 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Mina Anna MazziniДа, было бы неплохо запоминать, но куда? Какой-то параметр ей передавать при вызове, может?... Прицепить в хвостике вызова :) С другой стороны - у тебя параметры удобно-красиво-идентичны с мелкософтовским вызовом - мозг напрягать и оговаривать отдельно не надо. Я имел в виду в DLL. Первый раз кликаешь ДА и сообщение больше не появляется (всегда ДА по умолчанию становится) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 23:56 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
Mina Anna MazziniАга. Теперь в реестре появился: Код: plaintext
Спасибо огромное за помощь. Только я не прощаюсь ;) Скажи, вот по этому твоему проекту: http://www.cyberforum.ru/blogs/354370/blog3511.html Где лучше задать вопросы? Там или здесь? Лучше, если здесь, я новую тему создам - с меня станется :) А то у меня: не взлетает Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
. Лучше там. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2015, 23:57 |
|
VB6 Threads Потоки by ATM-TURBO 2
|
|||
---|---|---|---|
#18+
ATM-TURBO 2Mina Anna MazziniДа, было бы неплохо запоминать, но куда? Какой-то параметр ей передавать при вызове, может?... Прицепить в хвостике вызова :) С другой стороны - у тебя параметры удобно-красиво-идентичны с мелкософтовским вызовом - мозг напрягать и оговаривать отдельно не надо. Я имел в виду в DLL. Первый раз кликаешь ДА и сообщение больше не появляется (всегда ДА по умолчанию становится) Я тоже про нее. Только ты имеешь ввиду параметр на текущую сессию (как я понял) - так даже лучше, а я - на всю оставшуюся :) ATM-TURBO 2Лучше там. ОК ------------------------------------ Скомпилировал (native, wo optimisation) вариант без DLL, закомментив диалог об IDE. Та же ошибка. Тот же "парадокс" - твоя работает в IDE, падает в EXE, а MS CreateThread - рушит IDE на выходе, но прекрасно работает в EXE. Загнал все это дело в Olly, увидел свой код. До вызова vbCreateThread чуток не доходит. Но я наводку от нее все равно ужЕ получил - это как раз процедуры вывода в мой собственный лог. На них уже падало как-то. В некоторых местах я вынужден был и их отключить. Это публичные процедуры в другом модуле, а для вывода используется fso из подключенной MS Scripting Runtime. Буду думать, как вырезать из проекта больное место, чтобы показать тебе - еще раз благодарю за предложение. . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2015, 00:45 |
|
|
start [/forum/topic.php?fid=60&tid=2155882]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
others: | 301ms |
total: | 425ms |
0 / 0 |