Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6 Threads Потоки by ATM-TURBO 2 / 10 сообщений из 10, страница 1 из 1
27.06.2015, 12:03
    #38994277
Mina Anna Mazzini
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Здравствуйте.

Есть ряд вопросов по использованию 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.
Sub Main:   CreateThread --> CB_0        ' CB - CallBack
    
Sub CB_0:   Declared_Function_1 --> CB_1 ' then CB_1 will raised continuously further
            Timer.Enabled = True
            CloseHandle
            
CB_1                                     ' calc CB_1_Result inside
...
CB_1

Sub Timer:  If CB_1_Result Then          ' timer event raised
            Form_Timer.Enabled = False
            Declared_Function_2 --> CB_2
            Declared_Function_3 --> CB_3

 ' imo, it's not important what happened below this point
CB_1
...
CB_1

CB_2
CB_3

CB_1
...
CB_1

Sub Stop_Engine 


А вот - проблемы:

1. ATM-TURBO 2, первое, что я не сумел сделать - зареференсить к своему проекту ни TrickMultithreading.dll, ни EXEInitialize.tlb, ни через IDE, ни через regsvr32. ЧЯДНТ? И нужно ли это, если dll заработала и без этого. Но ...

2. ... Заработала она только в IDE. Скомпилировав проект в exe, я получил:
Код: plaintext
1.
Run-time error '91':
Object variable or With block variable not set
с подвешиавнием приложения и дальше - только убить процесс. Значит - что-то я все-таки делаю не так...
Обработчик ошибок в процедуре вызова [vb]CreateThread пока не стоит, а логи показывают, что до вызова callback-процедуры дело не доходит, а он должен происходить сразу после создания потока.

3. Чтобы снивелировать п.2 я установил на свою форму галку, чтобы можно было выбирать механизм трединга - твой или мелкософтовский. Заработало :)

4. MsgBox "Multithreading not working in IDE"
Я его вижу в modMultiThreading.bas. Посоветуй, как его правильнее отключить? А лучше - чтобы он сам определял - в IDE мы находимся или нет и, соответственно, делал выбор. И как, с какими параметрами, потом заново скомпилировать DLL?
.
...
Рейтинг: 0 / 0
27.06.2015, 16:04
    #38994300
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Привет.
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.
Private Declare Function vbCreateThread Lib "TrickMultithreading" ( _
                         ByVal lpThreadAttributes As Long, _
                         ByVal dwStackSize As Long, _
                         ByVal lpStartAddress As Long, _
                         ByVal lpParameter As Long, _
                         ByVal dwCreationFlags As Long, _
                         ByRef lpThreadId As Long) As Long


Ничего подключать не нужно. Нужно только чтобы DLL лежала в том месте где будет происходить поиск DLL при загрузке .
Mina Anna Mazzini2. ... Заработала она только в IDE. Скомпилировав проект в exe, я получил:
Код: plaintext
1.
Run-time error '91':
Object variable or With block variable not set
с подвешиавнием приложения и дальше - только убить процесс. Значит - что-то я все-таки делаю не так...
Обработчик ошибок в процедуре вызова [vb]CreateThread пока не стоит, а логи показывают, что до вызова callback-процедуры дело не доходит, а он должен происходить сразу после создания потока.
Это может зависеть от миллиона факторов. Описание ошибки соответствует тому, что ты обращаешься к методу объекта кторого нет. (возможно это локальная переменная одного потока и ты ее передаешь в другой или что-то еще. Вообще ссылку между потоками нельзя передавать без маршаллинга.
Mina Anna Mazzini3. Чтобы снивелировать п.2 я установил на свою форму галку, чтобы можно было выбирать механизм трединга - твой или мелкософтовский. Заработало :)
Что за мелкосовтовский трединг?
Mina Anna Mazzini4. MsgBox "Multithreading not working in IDE"
Я его вижу в modMultiThreading.bas. Посоветуй, как его правильнее отключить? А лучше - чтобы он сам определял - в IDE мы находимся или нет и, соответственно, делал выбор. И как, с какими параметрами, потом заново скомпилировать DLL?
.
Ну вообще он сам определяет. Так ты компилируешь DLL, а не EXE? В DLL этот метод не будет работать. Для DLL есть другой метод.
...
Рейтинг: 0 / 0
27.06.2015, 20:50
    #38994358
Mina Anna Mazzini
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
ATM-TURBO 2Если хочешь юзать DLL ... Да, именно так я изначально и сделал. И - спасибо за полезную ссыль.


ATM-TURBO 2Mina Anna Mazzini3. Чтобы снивелировать п.2 я установил на свою форму галку, чтобы можно было выбирать механизм трединга - твой или мелкософтовский. Заработало :) Что за мелкосовтовский трединг?
Ну, стандартный, который все применяют:
Код: vbnet
1.
Private Declare Function CreateThread Lib "kernel32" ( ...


Я это объявление оставил, а в месте вызова сделал:
Код: vbnet
1.
2.
3.
4.
5.
6.
Select Case bThreadMS                                            ' *** CB_OpenURL ***
    Case True:  pChnThr = CreateThread(0, 0, _
                    AddressOf sb_CB_OpenURL, lChnIdx, 0, lThrID) ' MS Kernel
    Case False: pChnThr = vbCreateThread(0, 0, _
                    AddressOf sb_CB_OpenURL, lChnIdx, 0, lThrID) ' ATM-TURBO 2
End Select




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.
Test.exe - Application Error
---------------------------
The exception Floating-point inexact result.
 (0xc000008f) occurred in the application at location 0x77e4bee7.

 Click on OK to terminate the program
Click on CANCEL to debug the program
---------------------------
OK   Cancel


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) у меня не подключается :(
.
...
Рейтинг: 0 / 0
27.06.2015, 20:53
    #38994359
Mina Anna Mazzini
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Везде, где я пишу "скомпилировал" - речь идет о моем проекте. Твою библиотеку и ее код я не трогаю.
...
Рейтинг: 0 / 0
27.06.2015, 22:09
    #38994379
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Mina Anna Mazzini,

автор А в exe - вот эта ошибка

Скинь EXE либо простейший проект где такое наблюдается. Я не смогу сказать в чем проблема пока не увижу проект или код.

авторСейчас скомпилировал в P-Code - но та же ошибка и вместе с ним второе окно вылезло:
В P-Code это не работает я думаю (не проверял).

авторПросто, когда я будучи в IDE, работаю, используя твою vbCreateThread, она меня постоянно предупреждает о том, что я в IDE, а я с ней постоянно соглашаюсь, что готов работать в одном потоке. Заколебывает немного :)
Нужно будет просто сделать запоминание. Как нибудь сделаю.

авторЕсли бы я мог подключить EXEInitialize.tlb, то я бы добавил твой модуль modMultiThreading.bas вместо объявления функции из DLL, а в нем (в модуле) закомментил бы вывод этого сообщения, но он (EXEInitialize.tlb) у меня не подключается :(
Если не подключается, значит в реестре нужно почистить. Найди в реестре запись {0000000E-0000-0000-0300-000000003AAB} и удали ее.
...
Рейтинг: 0 / 0
27.06.2015, 23:03
    #38994389
Mina Anna Mazzini
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
ATM-TURBO 2Если не подключается, значит в реестре нужно почистить. Найди в реестре запись {0000000E-0000-0000-0300-000000003AAB} и удали ее.
Нет у меня в реестре ничего похожего. Единственный ключ:
Код: plaintext
HKLM\SOFTWARE\Classes\Interface\{ 0000000e -0000-0000-C000-000000000046}
Но и тот ведет куда-то в лес...

Странно... Запустил oleview.exe , посмотрел для любопытства. Потом что-то тыркал взад-вперед свой проект. Дай думаю, попробую еще раз зареференсить - подхватилось. Правда я спартизанил - с другой папки пробовал.

Раскомментировал твой модуль modMultiThreading.bas , закомментировал декларацию TrickMultithreading.dll и все запустилось. Йез-з!


ATM-TURBO 2... она меня постоянно предупреждает... Заколебывает немного
Нужно будет просто сделать запоминание. Как нибудь сделаю.Да, было бы неплохо запоминать, но куда? Какой-то параметр ей передавать при вызове, может?... Прицепить в хвостике вызова :) С другой стороны - у тебя параметры удобно-красиво-идентичны с мелкософтовским вызовом - мозг напрягать и оговаривать отдельно не надо.


ATM-TURBO 2Скинь EXE либо простейший проект где такое наблюдается. Я не смогу сказать в чем проблема пока не увижу проект или код.Спасибо за предлождение. Я подумаю - как от него поотрезать все лишнее. А сейчас в новой концепции - без DLL с твоим VB-модулем - покодю, наработаю новых ошибок и вопросов :) Пусть устаканится.
.
...
Рейтинг: 0 / 0
27.06.2015, 23:19
    #38994396
Mina Anna Mazzini
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Ага. Теперь в реестре появился:
Код: plaintext
HKLM\SOFTWARE\Classes\TypeLib\{0000000E-0000-0000-0300-000000003AAB}
И в oleview.exe я ее вижу. Клас-с!
Спасибо огромное за помощь.

Только я не прощаюсь ;)
Скажи, вот по этому твоему проекту:
http://www.cyberforum.ru/blogs/354370/blog3511.html
Где лучше задать вопросы? Там или здесь?
Лучше, если здесь, я новую тему создам - с меня станется :)

А то у меня:
не взлетает
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Public Function Initialize(...) As Boolean
'[...]
    ret = waveOutOpen(hWave, WAVE_MAPPER, info.format, hWnd, 0, CALLBACK_WINDOW)
    If ret Then hWave = 0:  Exit Function
'[...]
End Function
' ? ret
' 32


.
...
Рейтинг: 0 / 0
27.06.2015, 23:56
    #38994402
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Mina Anna MazziniДа, было бы неплохо запоминать, но куда? Какой-то параметр ей передавать при вызове, может?... Прицепить в хвостике вызова :) С другой стороны - у тебя параметры удобно-красиво-идентичны с мелкософтовским вызовом - мозг напрягать и оговаривать отдельно не надо.
Я имел в виду в DLL. Первый раз кликаешь ДА и сообщение больше не появляется (всегда ДА по умолчанию становится)
...
Рейтинг: 0 / 0
27.06.2015, 23:57
    #38994403
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
Mina Anna MazziniАга. Теперь в реестре появился:
Код: plaintext
HKLM\SOFTWARE\Classes\TypeLib\{0000000E-0000-0000-0300-000000003AAB}
И в oleview.exe я ее вижу. Клас-с!
Спасибо огромное за помощь.

Только я не прощаюсь ;)
Скажи, вот по этому твоему проекту:
http://www.cyberforum.ru/blogs/354370/blog3511.html
Где лучше задать вопросы? Там или здесь?
Лучше, если здесь, я новую тему создам - с меня станется :)

А то у меня:
не взлетает
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Public Function Initialize(...) As Boolean
'[...]
    ret = waveOutOpen(hWave, WAVE_MAPPER, info.format, hWnd, 0, CALLBACK_WINDOW)
    If ret Then hWave = 0:  Exit Function
'[...]
End Function
' ? ret
' 32


.
Лучше там.
...
Рейтинг: 0 / 0
28.06.2015, 00:45
    #38994411
Mina Anna Mazzini
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6 Threads Потоки by ATM-TURBO 2
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.

Буду думать, как вырезать из проекта больное место, чтобы показать тебе - еще раз благодарю за предложение.
.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6 Threads Потоки by ATM-TURBO 2 / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]