On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение





Пост N: 141
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 06.08.19 14:59. Заголовок: Вывод на экран в нескольких потоках


Всем привет!
Есть такая программа:

#include "hbthread.ch"   

Function Main()

LOCAL nT1,nT2,nT3,nT4
LOCAL nSetDec := Set(_SET_DECIMALS,0)

nBegSec := Seconds()
SetCursor(0)

nT1 := hb_threadStart(HB_THREAD_INHERIT_MEMVARS,@MyFunc(), 1,10000,1)
nT2 := hb_threadStart(HB_THREAD_INHERIT_MEMVARS,@MyFunc(),10001,20000,2)
nT3 := hb_threadStart(HB_THREAD_INHERIT_MEMVARS,@MyFunc(),20001,30000,3)
nT4 := hb_threadStart(HB_THREAD_INHERIT_MEMVARS,@MyFunc(),30001,40000,4)

hb_threadJoin(nT1)
hb_threadJoin(nT2)
hb_threadJoin(nT3)
hb_threadJoin(nT4)

SetPos(5,0)
QOut("Runtime: ",SecToTime(Seconds()-nBegSec)) ; inkey(0)

RETURN NIL

Function MyFunc(n)

LOCAL nBegNum := hb_aParams()[1]
LOCAL nEndNum := hb_aParams()[2]
LOCAL nRow := hb_aParams()[3]
LOCAL nNum, aData

aData := {}
FOR nNum=nBegNum TO nEndNum
SetPos(nRow,0)
QQout( Str(nNum*100/nEndNum,6,2)+"%")
NEXT

RETURN NIL

На экране выводится вот так (вместо 4 значений с начала строки):

Кто виноват? и Что делать?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]


moderator


Пост N: 1331
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 07.08.19 09:09. Заголовок: Вы не учли, что выпо..


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

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 142
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 07.08.19 09:20. Заголовок: Александр, большое с..


Александр, большое спасибо за ответ!
Попробую Ваш совет:

 цитата:
А вообще, предоставлять всем потокам право работы с экраном - не очень хорошая идея.
Пусть лучше они собирают/вычисляют данные, а выводит их основная программа.



Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет