Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

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

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

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

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


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

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


 




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


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

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