Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Есть некая DLL (обычная, не ActiveX) от стороннего производителя. В ней реализованы CALLBACK- вызовы. Объявил в модуле CALLBACK-функцию, проверил ее работу - работает. Результаты, которые сторонняя DLL передает CALLBACK-функции, я сохраняю в коллекции. Коллекция объявлена в обычном классе. По таймеру (VB-шному, почему по нему, потому что нужно как можно быстрее добиться хоть какого-то решения) я читаю коллекцию, обрабатываю первый ее элемент и удаляю его. То есть имеем место очередь. С одной стороны CALLBACK функция пишет в коллекцию, с другой мой код ее читает. Разумеется возникли проблемы. Как наиболее простым способом сделать коллекцию потокобезопасной (средствами VB, альтернативными средствами)... есть у меня варианты через API, через mutex-ы, через SendMessage, но возможно есть более простой и надежный способ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 13:08 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
разговор ни о чём. код свой сюда и ошибку, которая у вас возникает, и укажите в каком месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 13:11 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Сейчас есть другая проблема. Обычная DLL-ка выполняет CALLBACK-вызовы. Для того, чтобы их обрабатывать, в обычном модуле описал подпрограмму с соответствующими параметрами. Все прекрасно работает. Теперь данное решение пытаюсь оформить в виде ActiveX DLL. Пока тестировал в группе проектов тоже все прекрасно работало. После того, как создал готовый ActiveX DLL (make dll) и подключил его в проект. Приложение стало валиться при обработке CALLBACK-а. В чем может быть проблема и как ее исправить?! PS: Когда тестировал CALLBACK без ActiveX DLL, то выяснил, что поток выполнения главной программы и CALLBACK-а один и тот же (использовал API GetCurrentThreadID), то есть никакой синхронизации не требовалось. Когда создал ActiveX Dll и тестировал ее в группе проектов, то потоки были уже разными, но ничего не падало. Когда создал make dll и стал использовать ее, то потоки тоже разные, но приложение падает... Очень срочно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2010, 19:20 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
myauchaПриложение стало валиться при обработке CALLBACK-а.В скомпилированном виде, под отладчиком или в обоих случаях? По-хорошему нужен исходник этой ActiveX dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 10:38 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Пока оставим в стороне сей вопрос (пока так и не разобрался)... вернусь к нему немного позже... тут теперь другой вопрос... Почему в VB не работают API EnterCriticalSection и LeaveCriticalSection?! Приложение валится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 14:20 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
myauchaПока оставим в стороне сей вопрос (пока так и не разобрался)... вернусь к нему немного позже... тут теперь другой вопрос... Почему в VB не работают API EnterCriticalSection и LeaveCriticalSection?! Приложение валится может вы неправильно что-то делаете? вот тут пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 14:23 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Ну вот, например, фрагмент для отладки. Что тут надо подправить? ' объявлено в модуле Public Type CRITICAL_SECTION dummy As Long End Type Public Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) Public Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) Public g_CS As CRITICAL_SECTION ' объявлено в форме Private Sub Command1_Click() EnterCriticalSection g_CS Dim i As Long i = 7 LeaveCriticalSection g_CS End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 14:45 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Код: plaintext сначала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 14:55 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Initialize я делал... падало, как оказалось из-за отсутствия DeleteCriticalSection :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 15:01 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
myauchaInitialize я делал... падало, как оказалось из-за отсутствия DeleteCriticalSection :)) delete делать в Form_Unload надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 15:02 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
init соответственно в Form_Load ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 15:03 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
вот кусок класса (см ссылки выше) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 15:06 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Не работает как надо. Какой-то полный бред получается. Если я меняю объявления Private m_objQueue As Collection Private m_CS As CRITICAL_SECTION местами, то VB падает при вызове любого метода. Если оставляю, как есть, то падает уже в потоке. Что не так, не пойму! Код: plaintext 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. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 17:48 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 17:51 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
2 Konst_One Если переписать Private Declare Sub InitializeCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) на Private Declare Sub InitializeCriticalSection Lib "kernel32" (byval lpCriticalSection As long) то будет ваш вариант. Сути это не меняет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 18:20 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
myauchaСейчас есть другая проблема. Обычная DLL-ка выполняет CALLBACK-вызовы. Для того, чтобы их обрабатывать, в обычном модуле описал подпрограмму с соответствующими параметрами. Все прекрасно работает. Теперь данное решение пытаюсь оформить в виде ActiveX DLL. Пока тестировал в группе проектов тоже все прекрасно работало. После того, как создал готовый ActiveX DLL (make dll) и подключил его в проект. Приложение стало валиться при обработке CALLBACK-а. В чем может быть проблема и как ее исправить?! PS: Когда тестировал CALLBACK без ActiveX DLL, то выяснил, что поток выполнения главной программы и CALLBACK-а один и тот же (использовал API GetCurrentThreadID), то есть никакой синхронизации не требовалось. Когда создал ActiveX Dll и тестировал ее в группе проектов, то потоки были уже разными, но ничего не падало. Когда создал make dll и стал использовать ее, то потоки тоже разные, но приложение падает... 1) Почему нельзя сделать так, чтобы callback-функция устанавливалась и выполнялась в одном потоке? Это особенность используемой обычной DLL (непонятно по описанию, диаграммы нет)? 2) ActiveX DLL обязательно Threading Model должна быть Apartment Threaded, или может быть Single Threaded? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 18:32 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
2 Бенедикт Если забыть на время об ActiveX DLL (это моя неудачная попытка обернуть обычную DLL) и сосредоточить свое внимание на обычной DLL-ке, которая и предоставляет callback-вызовы, то она работает следующим образом... я в главной программе вызываю функцию send этой dll (вызов асинхронный). Через некоторое время DLL-ка вызывает callback-функцию, которую я объявил у себя в модуле. Если вызвать GetCurrentThreadID в главной программе и в callback-е, то ид. потоков разные. Поскольку в самом callback-е мне надо обращаться к глобальным данным, то я пытаюсь выполнить синхронизацию посредством критических секций... пока не очень получается... если есть идеи, как это сделать, то предложите. Надеюсь, понятно изложил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 19:07 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
myaucha, да, так понятнее. К сожалению, плохой сценарий для VB6. Поток, порождаемый DLL, из которого вызывается callback-функция, не инициализирован для выполнения кода run-time библиотеки VB (версии 5, начиная с какого-то SP и 6 всех SP), а именно не настроен Thread Local Storage (TLS), подробнее см. статью "Create Worker Threads in DLLs" Мэтью Кёрланда (Matthew Curland) в VBPJ (Visual Basic Programmer's Journal) июня 1999 г. Попробуйте пока нарыть его статьи и книгу, там была глава по этому вопросу, он, по сути, единственный (ИМХО) авторитетный эксперт по теме. Если не найдёте, стукнитесь на мыло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 19:41 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Информацию не нашел... Как же мне все-таки корректно передать данные из CALLBACK-функции в поток основной программы? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 22:00 |
|
||
|
Потоки в VB
|
|||
|---|---|---|---|
|
#18+
Бенедиктmyaucha, да, так понятнее. К сожалению, плохой сценарий для VB6. Поток, порождаемый DLL, из которого вызывается callback-функция, не инициализирован для выполнения кода run-time библиотеки VB (версии 5, начиная с какого-то SP и 6 всех SP), а именно не настроен Thread Local Storage (TLS), подробнее см. статью "Create Worker Threads in DLLs" Мэтью Кёрланда (Matthew Curland) в VBPJ (Visual Basic Programmer's Journal) июня 1999 г. Попробуйте пока нарыть его статьи и книгу, там была глава по этому вопросу, он, по сути, единственный (ИМХО) авторитетный эксперт по теме. Если не найдёте, стукнитесь на мыло. см ссылку выше я давал на статью на основе его DLL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2010, 11:05 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36796422&tid=2159497]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 150ms |

| 0 / 0 |
