Форум » [x]Harbour » Вывод на экран в нескольких потоках » Ответить

Вывод на экран в нескольких потоках

ort: Всем привет! Есть такая программа: [pre2]#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[/pre2] На экране выводится вот так (вместо 4 значений с начала строки): Кто виноват? и Что делать?

Ответов - 2

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

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



полная версия страницы