Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мультипоточность 
:(
    Опции темы
Feliastre
Дата 4.4.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



У меня проблема: генерация отчёта занимает много времени. Надо сделать кнопку отменить. В дельфи я реализовывал мульти поточность. В С++ просто добавлял цикл обработки сообщений. А что делать в ВБ6?
PM MAIL ICQ   Вверх
Akina
Дата 4.4.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



А это смотря как ты организовал генерацию отчета.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
efedron
Дата 4.4.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 16.3.2005

Репутация: 4
Всего: 4



а вот тебе и многопоточность:
Код

'в форме
Private Sub Command1_Click()
    'создаем поток
    hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID)
    CloseHandle hThread
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'если поток еще выполняется, завершаем его
    If hThread <> 0 Then TerminateThread hThread, 0
End Sub
' в модуле
Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public hThread As Long, hThreadID As Long
Public Sub AsyncThread()
'твой код
End Sub

--------------------
Прежде чем совершить акт разрезания определенной материи целесообразно удостовериться в правильности всех произведенных измерений.
PM MAIL   Вверх
Exception
Дата 4.4.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Время от времени добавлять в код DoEvents()
Добавлено @ 16:11
Цитата(efedron @ 4.4.2005, 16:51)
а вот тебе и многопоточность:

по-моему ему не многопоточность нужна, а проверка, нажал ли юзер кнопку Cancel
PM   Вверх
efedron
Дата 4.4.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 16.3.2005

Репутация: 4
Всего: 4



Run-time error
Цитата
по-моему ему не многопоточность нужна, а проверка, нажал ли юзер кнопку Cancel

ну можно, конечно, doevents использовать, но это существенно снизит скорость выполнения процедуры...
--------------------
Прежде чем совершить акт разрезания определенной материи целесообразно удостовериться в правильности всех произведенных измерений.
PM MAIL   Вверх
Akina
Дата 4.4.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(efedron @ 4.4.2005, 19:27)
можно, конечно, doevents использовать, но это существенно снизит скорость выполнения процедуры...

Чтобы не снижать критично, размещаем DoEvents не непосредственно в цикле, а во внутренней конструкции типа:

Код

do 'собсно начало цикла
...
' вот тут DoEvents - но искусственно не на каждом обороте
Counter= (Counter+1) MOD N ' где N - порядка 1000
if Counter=0 then DoEvents
...
Loop ' конец цикла



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Feliastre
Дата 5.4.2005, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



efedron угу... почти работает... только при закрытии отрубаецца...


Akina класс!!! Работает!!!
PM MAIL ICQ   Вверх
cardinal
Дата 5.4.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Feliastre, с потоками в VB6 полная з%:ица. Как-то пытался с этим всем разобраться и понял, что лучше без многопоточности smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Feliastre
Дата 6.4.2005, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



D этой же теме хочу спросить ещё одно. Я делаю запрос из базы через компоненты ADO:
Код

dim rs as new ADODB.Recordset
set rs.ActiveConnection = Connection
rs.Source = "select * from MyTable"
rs.Open , , , , adCmdText


Только сам запрос не просто один селект, а примерно на две страницы. соответственно выборка данных происходит ДОЛГО. Можно ли открывать Рекордсет асинхронно?
PM MAIL ICQ   Вверх
Mephisto
Дата 6.4.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Я как-то читал литературку от майкрософта про вб, там написано что компилятор сам создает некую структуру потоков, и добавлять свои, либо удалять существующие они не рекомендуют.
Это касается версий 4,5,6. В вб.нет мультипоточнось допустима!
Добавлено @ 12:02
Akina, держи +1.
PM   Вверх
efedron
Дата 6.4.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 16.3.2005

Репутация: 4
Всего: 4



Akina
такое использование doevents известно, но я предпочитаю создавать отдельный поток..ну не знаю..больше нравится мне что-ли smile
--------------------
Прежде чем совершить акт разрезания определенной материи целесообразно удостовериться в правильности всех произведенных измерений.
PM MAIL   Вверх
Feliastre
Дата 6.4.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



efedron ну а ты можешь предложить работающий пример потоков. То что ты предложил - не пашет.
PM MAIL ICQ   Вверх
Mephisto
Дата 8.4.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата(efedron @ 6.4.2005, 13:26)
, но я предпочитаю создавать отдельный поток

Не люблю повторятся, но:
Цитата(Mephisto @ 6.4.2005, 12:01)
добавлять свои, либо удалять существующие они не рекомендуют.

Проверено, очень часто сами слетают. Необходимо выравнивать ручками. Вылетают, причем, в самых неожиданных местах.

Добавлено @ 10:18
efedron, поправь запись:
Цитата(efedron @ 4.4.2005, 15:51)
Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

Хоть бы на эту:
Код

Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, _
    ByVal dwStackSize As Long, _
    ByVal lpStartAddress As Long, _
    lpParameter As Any, _
    ByVal dwCreationFlags As Long, _
    lpThreadID As Long) As Long


PM   Вверх
Exception
Дата 12.4.2005, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Akina, в чем проблема твоего кода: проверка происходит раз в 1000 проходов цикла. Я придумал решение: ф-ция GetInputState возвр. не ноль, если было сообщение от мыши или клавы.
Код

Declare Function GetInputState Lib "user32" _
Alias "GetInputState" () As Long 

For counter = 1 To 100000
If GetInputState() Then DoEvents
'Твой код
Next counter

PM   Вверх
Akina
Дата 12.4.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Run-time error
Ну на самом деле я кусок-то диранул из цикла, который еще до кучи прогрессором управлял... там оно было проще как я сделал. По сути же согласен с тобой полностью - твой код лучше. Впрочем для тех кто с API боится или что (или времени нет вспоминать) и мой сойдет.

Только код поправь - в декларации алиас тут не нужен... и отпиши чтобы в ФАК вставили.

PS. Впрочем есть еще один момент, который мой код разруливает, а твой нет - это тормоза перерисовки неактивных элементов экрана.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Mephisto
Дата 13.4.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата(Akina @ 12.4.2005, 16:16)
Впрочем есть еще один момент, который мой код разруливает, а твой нет - это тормоза перерисовки неактивных элементов экрана.

Да, но медленее будет (насколько я думаю).

2Run-time error, вот если б именно обрабатывать сообщения для конкретной кнопки...
Но, тогда можно забыть про всякие там перерисовки.
PM   Вверх
Exception
Дата 13.4.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Насчет алиаса - простите, случайно smile

Цитата(Akina @ 12.4.2005, 17:16)
тормоза перерисовки неактивных элементов экрана

я пороюсь в справочнике по апи, может что нарою...
пока что
Код

Declare Function GetInputState Lib "user32" () As Long 

For counter = 1 To 100000
If GetInputState() Then DoEvents 'Если есть сообщение от мыши или клавы
'Твой код
Next counter

PM   Вверх
Akina
Дата 13.4.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(Mephisto @ 13.4.2005, 12:29)
вот если б именно обрабатывать сообщения для конкретной кнопки...

сам понял что сказал? DoEvents как раз и нужен в основном для того чтобы они обрабатывались smile


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Mephisto
Дата 14.4.2005, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата(Akina @ 13.4.2005, 12:36)
сам понял что сказал? DoEvents как раз и нужен в основном для того чтобы они обрабатывались

Может я чего не знаю? Но мне кажется DoEvents за ставит перебрать все сообщения поступившие родительской форме, и естественно всех дочерних (кнопки, картинки...). А я имею ввиду принудительно заставить проработать только сообщения одной конкретной кнопки нажатие которой ожидается!
Добавлено @ 15:50
Ну, про прорисовку остальных компонентов можно забыть!

Это сообщение отредактировал(а) Mephisto - 14.4.2005, 15:50
PM   Вверх
Akina
Дата 14.4.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(Mephisto @ 14.4.2005, 16:48)
только сообщения одной конкретной кнопки нажатие которой ожидается

а-а-а...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Mephisto
Дата 15.4.2005, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Необходимо создать оконную процедуру для этой кнопки и подменить ей стандартную, потом сделать так как ты предлогал в случае с DoEvents, только вызывать твою оконную процедуру с оброботкой только одного сообщения Click, ну можно еще сделать перерисовку данной кнопки. Работать должно быстрее.
Не знаю насколько понятно обьяснил, может попробую реализовать на примере, но сейчас не могу ничего обещать, на работе завал + учёба!
PM   Вверх
Exception
Дата 16.4.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Цитата(Mephisto @ 16.4.2005, 00:07)
только вызывать твою оконную процедуру с оброботкой только одного сообщения Click

В смысле WM_CLICK или как-то так?
PM   Вверх
Exception
Дата 17.4.2005, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Я открыл Reflector'ом класс Систем.Виндовс.Формс.Аппликейшн и посмотрел исходники (это я про .нет). Дело в том, что в .нете есть тоже ф-ция DoEvents(). Так вот, там организован цикл обработки сообщений. Вот как работает DoEvents. Можно самим попариться с GetMessage и если сообщение не для кнопки, игнорировать его.
PM   Вверх
Gannibal
Дата 17.4.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 742
Регистрация: 15.4.2003
Где: 010101

Репутация: 18
Всего: 17



вот статья почитайте интересная кстати

http://www.sources.ru/vb/vb_multithreading_in_vb.shtml
http://www.sources.ru/vb/vb_multithreading_01.html

Это сообщение отредактировал(а) M.E.G.U.S - 17.4.2005, 13:01


--------------------
Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить!
PM MAIL ICQ   Вверх
Exception
Дата 18.4.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Читал я это...
PM   Вверх
Exception
Дата 20.4.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.