Все вопросы связанные с программированием. Языки программирования. Средства разработки.
Аватара пользователя
TOSHIK
Не в сети
Администратор
Администратор
Сообщения: 6596
Зарегистрирован: Пт авг 08, 2003 13:49
Откуда: Ростов-на-Дону
Контактная информация:

VBA Access ::: Многозадачность

Сообщение TOSHIK »

(с) dBaser

На самом деле, даже если ОС многозадачная, то эта самая многозадачность работает только если это предусмотренно в коде программы...

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


РЕШЕНИЕ ПРОБЛЕМЫ:

Для решения этой проблемы нужно всего лишь поместить в цикл одну команду:

Код: Выделить всё

DoEvents
без всяких скобочек и точек с запятыми...

пример:

Код: Выделить всё

private sub cikl() 
          
for i=1 to 1000 step 1

     a=a+i 'само тело цикла  (операторы и функции)

     DoEvents

next i


end sub
Вот и все 8)



НО! Этот пример решает одну проблему, но создает одновременно другую... Этой самой "другой" проблемой является (тут умное слово должно быть - но забыл... :( ) вобщем появляется возможность запустить один и тот же цикл много раз и тем самым переполнить память и так же завесить систему...
Хотя и это не проблема... Нужно установить переменную которая будет указывать "запущен ли цикл или функция" и если запущен, то не запускать его снова...
Если появятся интересующиеся, то я напишу как это организовать и тогда у вас будет реально многозадачное приложение!

УДАЧИ!!!
Активисты все еще ищутся здесь!

Iron Man
Не в сети
Частый гость
Частый гость
Сообщения: 176
Зарегистрирован: Пн фев 07, 2005 14:03

Сообщение Iron Man »

TOSHIK, причём тут многозадачность??? (а точнее многопоточность) :D
Kill your Self >> save the Planet

Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

Сообщение dBaser »

Iron Man, читай начало поста!
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

Аватара пользователя
c0der
Не в сети
Новичок
Новичок
Сообщения: 45
Зарегистрирован: Ср апр 14, 2004 15:06

Сообщение c0der »

dBaser

Iron Man прав, многозадачность тут не причём. Возьми две кнопки и два текстбокса (имена текстбоксов TextBox1 и TextBox2), в обработчик нажатия первой кнопки вставь

For i = 0 To 10000
TextBox1.Value = i
DoEvents
Next i

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

For i = 0 To 10000
TextBox2.Value = i
DoEvents
Next i

И нажми сначала одну кнопку, а затем другую, видно, что нажатие на вторую кнопку прекращает выполнение первого цикла, до тех пор, пока не выполнится второй, и где тут многозадачность???

P.S. кстати, а ты знаешь что делает DoEvents?
rep movsd

Аватара пользователя
DbIMok
Не в сети
Администратор
Администратор
Сообщения: 8268
Зарегистрирован: Ср янв 28, 2004 7:15

Сообщение DbIMok »

конечно прав: многозадачность != многопоточность. DoEvent обрабатывает очередь сообщений приложения, ни больше ни меньше. это не делает приложение многопоточным, и уж тем более многозадачным (многозадачность св-во ОС) на самом деле правильнее написать что-то типа: "как отрисовывать интерфейс во время работы циклов"

Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

Сообщение dBaser »

c0der, dm, Вы аргументировано правы!


Действительно правильнее будет многопоточность...
Но менять название топика я не буду т.к. "многозадачность" как бы более ярко отображает основную мысль темы если не копать глубоко! А в самой теме Вы уже сделали поправку и я не вижу смысла править первый пост!



А что касается многопоточности и нужности этого топика, то считаю его довольно коректным.
Вас никто не заставляет применять это решение...
Но если вас парит когда при выполнении большого цикла на форме все приложение виснет... вобщем каждый сам решает что ему делать!

Предложите свое решение! На то этот раздел и создан, что бы все обсуждать и находить более оптимальные решения!
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

Аватара пользователя
DbIMok
Не в сети
Администратор
Администратор
Сообщения: 8268
Зарегистрирован: Ср янв 28, 2004 7:15

Сообщение DbIMok »

dBaser, решение правильное, с ним никто не спорит. тебе лишь указали на неправильное использование терминологии. к сожалению, ты ничего не понял :(

многопоточность это создание thread, чего в случае DoEvent не происходит. многозадачность - выполнение ОС множества задач. смысл программирования не в том чтобы "ярко" что-то выразить, а как раз в том чтобы "копать" глубоко.

приложение не "виснет" оно временно перестает обрабатывать поступающие события. ничего "оптимальнее" чем сделать DoEvent в данном случае не придумаешь, только не надо путать новичков называя это многопоточностью или, еще хуже, многозадачностью

Аватара пользователя
DbIMok
Не в сети
Администратор
Администратор
Сообщения: 8268
Зарегистрирован: Ср янв 28, 2004 7:15

Re: VBA Access ::: Многозадачность

Сообщение DbIMok »

TOSHIK писал(а):На самом деле, даже если ОС многозадачная, то эта самая многозадачность работает только если это предусмотренно в коде программы...(с) dBaser
В современных ОС реализована вытесняющая многозадачность, при которой операционная система не ждет, когда нить сама захочет освободить процессор, а принудительно снимает ее с выполнения после того, как та израсходовала отведенное ей время (квант), или если в очереди готовых появилась нить с более высоким приоритетом.

Аватара пользователя
TOSHIK
Не в сети
Администратор
Администратор
Сообщения: 6596
Зарегистрирован: Пт авг 08, 2003 13:49
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение TOSHIK »

многопоточность это создание thread, чего в случае DoEvent не происходит. многозадачность - выполнение ОС множества задач.
dm, а как можно этого добиться в данной ситуации?
Активисты все еще ищутся здесь!

Gorinich
Не в сети
Постоялец
Постоялец
Сообщения: 538
Зарегистрирован: Ср мар 17, 2004 1:55
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение Gorinich »

С огромным гимором )))
Насколько мне позволяет память, это можно сделать при помощи API функций CreateThread и StartBackgroundThreadFree. А вот как оно работает, хоть убей не вспомню ))) По правде сказать, я с этим не экспериментровал. Просто когда-то давно, когда еще тащился по VB, читал много и память у меня немного помнит.
Последний раз редактировалось Gorinich Вт мар 29, 2005 10:40, всего редактировалось 1 раз.
Чем меньше женщинам мы больше, тем больше меньше они нам.
http://gorinich.net

Аватара пользователя
TOSHIK
Не в сети
Администратор
Администратор
Сообщения: 6596
Зарегистрирован: Пт авг 08, 2003 13:49
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение TOSHIK »

С огромным гимором )))
Gorinich, а какая может быть ситуация когда это реально понадобится? Или это из области "если вам скучно смотреть на работающую программу"?
Активисты все еще ищутся здесь!

Gorinich
Не в сети
Постоялец
Постоялец
Сообщения: 538
Зарегистрирован: Ср мар 17, 2004 1:55
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение Gorinich »

У меня такая ситуация не разу не понадобилась )))
Скорее это из названной тобою области, а если серьезно, то это может понадобится только для решения специфических задач.
И вообще, что может обычного программиста подтолкнуть программировать многопоточность, тем более в MSAccess???
Чем меньше женщинам мы больше, тем больше меньше они нам.
http://gorinich.net

Аватара пользователя
DbIMok
Не в сети
Администратор
Администратор
Сообщения: 8268
Зарегистрирован: Ср янв 28, 2004 7:15

Сообщение DbIMok »

насчет Access ничего не скажу, а я использую потоки

Iron Man
Не в сети
Частый гость
Частый гость
Сообщения: 176
Зарегистрирован: Пн фев 07, 2005 14:03

Сообщение Iron Man »

Gorinich,
С огромным гимором )))
Насколько мне позволяет память, это можно сделать при помощи API функций CreateThread и StartBackgroundThreadFree. А вот как оно работает, хоть убей не вспомню ))) По правде сказать, я с этим не экспериментровал. Просто когда-то давно, когда еще тащился по VB, читал много и память у меня немного помнит.
Не знаю как на VB, на Delphi это делается за 5 секунд.... не разу не приходилось серьёзный делать проект БЕЗ многопоточности, обычно всегда возникает ситуация, когда нужно несколько потоков...

На VB вообще гморой с вызовом API, как вы на нём вообще что-то делаете... :wink:
Kill your Self >> save the Planet

Gorinich
Не в сети
Постоялец
Постоялец
Сообщения: 538
Зарегистрирован: Ср мар 17, 2004 1:55
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение Gorinich »

Я на нем ничего уже давно не делаю )))
Если приспичит, то выберу скорее C++ или C#.
Чем меньше женщинам мы больше, тем больше меньше они нам.
http://gorinich.net

Ответить