Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Приостановка потока

46K
30 сентября 2010 года
nILruM
30 / / 10.02.2010
Есть задача получения данных с прибора.
Перед тем как опросить прибо его надо настроить..
Чтото типо этого:

Код:
unsigned char mdCommand[6];

mdCommand[0] = 0x20;
mdCommand[1] = 0x02;
mdCommand[2] = 0x02;
mdCommand[3] = 0x00;
mdCommand[4] = 0x20;
mdCommand[5] = 0x01;

SetNastr(mdCommand);
//далее полторы секунды идет настройка и опрос прибора
Sleep(1500);
//после опроса я получаю данные

int ReadByte=512;
unsigned char* usDC=new unsigned char[ReadByte];

GetData(ReadByte,usDC);

//и вывожу на экран
delete usDC;


Так вот когда я выполняю этот код в основном потоке программы она подвисает на полторы секунды.
Если я переношу этот код во второй поток, то основной поток программы все равно подвисает на полторы секунды.

Вопрос: Как еще пожно приостановить поток не используя Sleep()?
240
30 сентября 2010 года
aks
2.5K / / 14.07.2006
Цитата: nILruM

Если я переношу этот код во второй поток, то основной поток программы все равно подвисает на полторы секунды.


Что то сказки рассказываете. Код бы посмотреть либо вывод программы, по которому понимаете, что основной поток тоже подвисает.

Цитата: nILruM

Вопрос: Как еще пожно приостановить поток не используя Sleep()?


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

46K
30 сентября 2010 года
nILruM
30 / / 10.02.2010
На главную форму кидаю таймер с интервалом 100 миллисек, у которого в обработчике событие считаю прошедшее время:

 
Код:
int PredTick=0;

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Caption=IntToStr(GetTickCount()-PredTick);
PredTick=GetTickCount();
}


Так же по нажатию кнопки на форме происходит создание потока:

 
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
BufThread=new NewThread(false);
}


Код класса потока:

Код:
void __fastcall NewThread::Execute()
{
        //---- Place thread code here ----
this->Synchronize(Work);
}

void __fastcall NewThread::Work()
{
 Form1->Label1->Caption="Начало паузы";
 Sleep(1500);
 Form1->Label1->Caption="Конец паузы";
}


Так вот при нажатии на кнопку создания потока в заголовке отображается значение 1560, а должно быть в районе 100
46K
30 сентября 2010 года
nILruM
30 / / 10.02.2010
Цитата: aks

А чем вам не устраивает sleep? Что вам собственно нужно то?



Мне надо чтобы выполнение основного потока не тормозилось на 1,5 секунды..

14
01 октября 2010 года
Phodopus
3.3K / / 19.06.2008
Почтайте справку по методу TThread::Synchronize() и больше не используйте его подобным образом.
[COLOR="Silver"]ПыСы. Последователь Архангельского?[/COLOR]
46K
02 октября 2010 года
nILruM
30 / / 10.02.2010
Цитата: Phodopus

[COLOR="Silver"]ПыСы. Последователь Архангельского?[/COLOR]


Архангельского читал, но не сказал бы что последователь))

1.9K
04 октября 2010 года
George22
91 / / 09.12.2007
Используйте CreateThread() и не будет проблем,
если конечно грамотно взаимодействовоть с основной
программой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог