purebasic.info

PureBasic forum
Текущее время: Вт янв 22, 2019 10:07 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 114 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Паралельные потоки
СообщениеДобавлено: Пн мар 22, 2010 3:34 pm 
Не в сети
студент

Зарегистрирован: Пт ноя 27, 2009 4:13 pm
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте Всем!
Я часто вижу что пишут в темах "выделить в отдельный поток"
А что это такое и счем это едят? Я понял что это процедура но почему тогда поток. Процедуру нужно запускать или я не прав.
Меня интересует например такая задача, Какая-то процедура читает данные с ацп через принтерный порт и забивает их в заранее глобальный обьявленный массив . А другая процедура из этого массива их берет и обрабатывает маштабирует и тд и тп и выводит на экран в виде графика. Подскажите как правильно разделить потоки, и заставить процедуру выполнятся непрерывно или для этого нужно использовать какое-то прерывание. Заранее спасибо.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 3:49 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт фев 26, 2009 1:53 am
Сообщений: 1154
Откуда: Беларусь, Витебск
Благодарил (а): 22 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Как я понял, потоки для данной задачи не требуются. Потоки используются в том случае, если необходимо выполнять две задачи ОДНОВРЕМЕННО, но не последовательно. То есть: есть таймер, который отсчитывает время до конца света. А нужно еще, чтобы другой таймер ОДНОВРЕМЕННО считал время, прошедшее с 1970 года.
Пример из хелпа:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure AlertThread(Parameter)
 
  Repeat
    Debug "Alert !"
    Delay(3000)
  ForEver
 
EndProcedure
 
CreateThread(@AlertThread(), 154)
 
MessageRequester("Info", "It will display an alert every 3 seconds."+#LF$+"Click To finish the program", 0)



Вместе с окошком сообщения возникает дебаг. Без потоков осуществить такое проблематично.

_________________
Ubuntu 10.10, PureBasic 4.61 x86
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 4:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11363
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
rx9abc писал(а):
Я понял что это процедура но почему тогда поток
Потому что она выполняется не зависимо от остальной части проги.
Например, если основная прога повиснет, код этой процедуры будет выполняться.
Тоже самое касается и кода в отдельном потоке. Если он вдруг повиснет, это никак не отразится на работе самой проги.
Приведу такой пример, при работе с USB HID устройствами, если данные не поступили, то прога просто виснет в API функции ReadFile, до тех пор, пока не поступят данные. Вот эту функцию можно вынести в отдельный поток и путсь принимает данные по мере их поспупления не вешая саму прогу.

rx9abc писал(а):
Какая-то процедура читает данные с ацп через принтерный порт и забивает их в заранее глобальный обьявленный массив . А другая процедура из этого массива их берет и обрабатывает маштабирует и тд и тп и выводит на экран в виде графика.
Если для этого требуется не очень много времени (скажем, не более 100 миллисекунд), то лучше для этого использовать таймер.

rx9abc писал(а):
заставить процедуру выполнятся непрерывно

Вот запуск процедуры как отдельного потока и организация "вечного" цикла в ней. Не забываем включить поддержку потоков в опциях проекта!
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure DateStatusBar(*x) 
Repeat
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  StatusBarText(0, 0,Time) ; Выводим его на строку состояния
  Delay(1000)
ForEver
EndProcedure
 
If OpenWindow(0,0,0,230,100,"Строка состояния",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
   CreateStatusBar(0, WindowID(0))
   AddStatusBarField(80)
   AddStatusBarField(120)
  StatusBarText(0, 1, " Текущее время") ; Выводим строку в область с идентификатором 1.
 
  CreateThread( @DateStatusBar(),0) ; Запуск процедуры в отдельном потоке
   
  Repeat
   Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
 EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 4:13 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11363
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
Angelian писал(а):
Без потоков осуществить такое проблематично.
Таймер ещё никто не отменял. :)
Код:
1
2
3
4
5
6
7
8
Procedure AlertThread() 
    Debug "Alert !"
EndProcedure
 
OpenWindow(0,0,0,0,0,"",#PB_Window_Invisible)
SetTimer_(WindowID(0),1,1000,@AlertThread() )
 
MessageRequester("Info", "It will display an alert every 3 seconds."+#LF$+"Click To finish the program", 0)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 6:06 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн апр 27, 2009 5:18 pm
Сообщений: 387
Откуда: Череповец, Вологодская область
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Цитата:
Таймер ещё никто не отменял

Пётр, можно ли будет олавливать события, происходящие в окне? Типа нажатие на кнопку?
Или как это можно сделать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 6:26 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11363
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
BaCo писал(а):
Пётр, можно ли будет олавливать события, происходящие в окне?
Нельзя.
Код:
1
2
3
4
5
6
7
8
9
Procedure AlertThread() 
  Debug WindowEvent()
EndProcedure
 
OpenWindow(0,0,0,100,80,"")
ButtonGadget(1,10,10,80,24,"Кнопка")
SetTimer_(WindowID(0),1,10,@AlertThread() )
 
MessageRequester("Info", "It will display an alert every 3 seconds."+#LF$+"Click To finish the program", 0)  



Если создать окно в отдельном потоке, то получается.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure AlertThread(x) 
OpenWindow(0,0,0,100,80,"")
ButtonGadget(1,10,10,80,24,"Кнопка")
Repeat
 Event=WaitWindowEvent()
 If event=#PB_Event_Gadget
   If EventGadget()=1
     Debug "Клик по кнопке"
   EndIf
 EndIf
Until Event=#PB_Event_CloseWindow
EndProcedure
 
 
CreateThread(@AlertThread(),0 )
 
MessageRequester("Info", "It will display an alert every 3 seconds."+#LF$+"Click To finish the program", 0)  
 
 


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 6:33 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн апр 27, 2009 5:18 pm
Сообщений: 387
Откуда: Череповец, Вологодская область
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
а вот если надо, чтобы окно было открытым (обрабатывало событие и др) + второе действие, например с функцией delay?
--------
разобрался! надо было выше глянуть :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Пн мар 22, 2010 7:39 pm 
Не в сети
доцент

Зарегистрирован: Пн июл 20, 2009 10:51 am
Сообщений: 43
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
rx9abc писал(а):
Я часто вижу что пишут в темах "выделить в отдельный поток"
А что это такое и счем это едят?
Хочу вставить свои 5 копеек.
Для чего нужны потоки.
Во первых сама Windows ресурсоемкие запросы, например вывод графики, оформляет в виде отдельного потока, чтобы основная программа продолжала реагировать на события пользователя. Здесь очень неприятные грабли. Повторное обращение к графике будет проигнорировано, до завершения предыдущего. Программа будет выполнятся не в том порядке, как указано в тексте программы.
В API есть два варианта обращения к ресурсам:
SendMessage_(...) - ждать завершения порожденного потока;
PostMessage_(...) - не ждать завершения порожденного потока.
Как я с пользой использовал потоки.
Мне надо было наносить и убирать метки на большое изображение, и перемещать изображение в окне с помощью мыши. Для переключения режима перемещать/добавить/удалить метку я использовал кнопку-модификатор с клавиатуры. Без потоков у меня сохранялось последнее состояние, что было неудобно и вызывало ошибки, когда я забывал восстановить стандартный режим - перемещение в окне.
Я сделал поток с таймером в котором хранилось последнее состояние кнопки модификатора, и если кнопки мыши не активировались более заданного интервала времени, то состояние модификатора сбрасывалось в исходное состояние.
Еще потоки полезны, как указывали более опытные товарищи, когда надо долго ждать данных. Но при этом надо позаботиться о том, чтобы не пытаться обрабатывать то, чего еще нет.
Лично мое отношение к потокам, преимущественно отрицательное - программа делает совсем не то, что ожидаешь. Яркий пример непредсказуемое поведение Windows. Во времена DOS можно было хоть 100 раз запускать программу и она все 100 раз вела себя одинаково. Если в программе была ошибка, то я ее находил. А в Windows, если происходит сложная ошибка, то второй раз ее можно ждать неопределенно долго, что в результате порождает море не отлаженных до конца программ.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 11:18 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
kvi писал(а):
Во времена DOS можно было хоть 100 раз запускать программу и она все 100 раз вела себя одинаково. Если в программе была ошибка, то я ее находил. А в Windows, если происходит сложная ошибка, то второй раз ее можно ждать неопределенно долго, что в результате порождает море не отлаженных до конца программ.



В чем проблема? сиди под дос!
Лично меня не смущают потоки, умное их сопровождение и не родятся никакие глюки вечности. ИМХО

_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 7:57 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2307
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Артём писал(а):
Лично меня не смущают потоки, умное их сопровождение и не родятся никакие глюки вечности. ИМХО

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

Использую их во время приема данных от сервера в своем проекте, что бы они принимались в фоне, а работа с GUI продолжалась.

kvi писал(а):
SendMessage_(...) - ждать завершения порожденного потока;

WaitThread() в PB :).

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вт мар 23, 2010 11:22 am 
Не в сети
доцент

Зарегистрирован: Пн июл 20, 2009 10:51 am
Сообщений: 43
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvi писал(а):
Лично мое отношение к потокам, преимущественно отрицательное - программа делает совсем не то, что ожидаешь.
Хочу уточнить. Очень плохо когда процессы порождающие потоки ни как специально не помечаются, и анализируя листинг программы об этом никак не догадываешся. Такое, к сожалению, имеет место в Java, в других средах, и, слишком часто, в WinAPI.
Когда я пишу:
A=1
B=2
C=A+B
То должен быть уверен, что третий оператор выполнится после первых двух. И не должен ставить никаких семафоров для определения готовности вычислений третьего оператора.
Если появляются потоки, то это должно быть явно видно из листинга.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 11:36 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
kvi писал(а):
kvi

на данный момент разговор ни о чём, а в частности о неправильности организации потоков. Сам работал с потоками в количестве более тысячи, пока не уперся в ограничение (толи винды, толи еще чего), и все они прекрасно работали "параллельно" выполняя свои задачи. Я например не представляю себе сейчас, свою программу без потоков (таймер отношу сюдаже, понимаю что с натяжкой)...

По твоему примеру: в крайности впадать конечно тоже не надо, если задачу можно без потока сделать, смыл ее распихивать и "замудрять" в потоки (по крайней мере разные), ради того чтобы были эти сами потоки? А суть и сам ты поймешь, когда столкнешься с соответствующей проблемой и увидишь как будет все прекрасно работать с потоками (в потоках).....


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 11:56 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11363
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
Да, потоки нужно использовать лишь в случае необходимости, скажем, когда нужно выполнять длительную работу, или когда какая-то функция тупо на некоторое время вешает прогу, скажем, API функция Beep, или API ReadFile при чтении из HID устройств (см. 3 пост темы).

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 12:25 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11363
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
В PB4.40 появился оператор Threaded, вроде как-то связанный с потоками.
Кто-нибудь его уже использовал?
Что-то не понял зачем он нужен. :?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 12:32 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
И я за тоже. Все надо организовывать заранее а не ловить глюки и говорить что во все виновата виндовс со своими потоками. По сути каждое приложение это поток. Но они почему то работают! НЕ ЗАМЕЧАЛ фатальных глюк в винде, чтоб вот так категорично относиться! Я за потоки! Если они нужны, я еще таймер использую, очень удобная вещь! и не каких глюков!

_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 114 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB