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

Ваш аккаунт

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

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

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

Thread c приоритетом... выполняется с задержками

20K
05 сентября 2006 года
rulan
2 / / 05.09.2006
Здравствуйте форумчане!
Буду благодарен если кто нибудь объяснит мне следующую закономерность:

Имеем простой тред который передает время в компонент Memo1 главной формы, тред имет приоритет tpTimeCritical:

Unit1.h
Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class GetData : public TThread
{          
private:
protected:
        void __fastcall Execute();
public:
        __fastcall GetData(bool CreateSuspended);
        Word Hour, Min, Sec, MSec;
        int counter;
        };
#endif

end of Unit1.h


Unit1.cpp
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "test.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

__fastcall GetData::GetData(bool CreateSuspended)
        : TThread(CreateSuspended)
{
counter =0;
}
//---------------------------------------------------------------------------
void __fastcall GetData::Execute()
{

do
        {
        DecodeTime(Now(), Hour, Min, Sec, MSec);
        Form1->Memo1->Lines->Add("------" + IntToStr(Sec)+" "+IntToStr(MSec)+"\t"+IntToStr(counter));
        counter++;
        }
while (! Terminated);

}

end of Unit1.cpp

Основная форма с двумя кнопками и компонентом Memo1:

test.cpp
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "test.h"
#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

GetData *Thread;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}

void __fastcall TForm1::Button5Click(TObject *Sender)
{
Thread = new GetData(false);
Thread->FreeOnTerminate = true;
Thread->Priority = tpTimeCritical;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{
Thread->Terminate();
}
//---------------------------------------------------------------------------

end of test.cpp


Запускаем .... ждем .... останавливаем.

В Memo1 имеем:

------24 130 0
------24 130 1
------24 130 2
------24 190 3
------24 190 4
------24 190 5
------24 190 6
------24 190 7
------24 190 8
------24 190 9
------24 190 10
------24 190 11
------24 190 12
------24 190 13
------24 190 14
------24 190 15
------24 190 16
------24 190 17
------24 190 18
------24 190 19
------24 190 20
------24 190 21
------24 190 22
------24 190 23
------24 190 24
------24 240 25
------24 240 26
------24 240 27
------24 240 28
------24 240 29
------24 240 30
------24 240 31
------24 240 32
------24 240 33
------24 240 34
------24 240 35
------24 240 36
------24 240 37
------24 240 38
------24 240 39
------24 300 40
------24 300 41
------24 300 42
------24 300 43
------24 300 44
------24 300 45
------24 300 46
------24 300 47
------24 300 48
------24 300 49
------24 300 50
------24 300 51
------24 300 52
------24 300 53
------24 300 54
------24 300 55
------24 350 56
------24 350 57
------24 350 58
------24 350 59
------24 350 60
------24 350 61
------24 350 62
------24 350 63
------24 350 64
------24 350 65
------24 350 66
------24 350 67
------24 350 68
------24 350 69
------24 350 70
------24 350 71
------24 410 72
------24 410 73
------24 410 74
------24 410 75
------24 410 76
------24 410 77
------24 410 78
------24 410 79
------24 410 80
------24 410 81
------24 410 82
------24 410 83
------24 410 84
------24 410 85
------24 410 86
------24 410 87
------24 460 88
------24 460 89
------24 460 90
------24 460 91
------24 460 92
------24 460 93
------24 460 94
------24 460 95
------24 460 96
------24 460 97
------24 460 98
------24 460 99
------24 520 100
------24 520 101
------24 520 102
------24 520 103
------24 520 104
------24 520 105
------24 520 106
------24 520 107
------24 520 108
------24 520 109
------24 520 110
------24 520 111
------24 570 112
------24 570 113
------24 570 114
------24 570 115
------24 570 116
------24 570 117
------24 570 118
------24 570 119
------24 570 120
------24 570 121
------24 570 122
------24 570 123
------24 570 124
------24 570 125
------24 570 126
------24 570 127
------24 570 128
------24 570 129
------24 630 130
------24 630 131
------24 630 132
------24 630 133
------24 630 134
------24 630 135
------24 630 136
------24 630 137
------24 630 138
------24 630 139
------24 630 140
------24 630 141
------24 630 142
------24 630 143
------24 630 144
------24 630 145
------24 680 146
------24 680 147
------24 680 148

Вопрос: Почему цикл в треде выполняется несколько раз за одну миллисекунду, потом выжидает 50-60 миллисекунд и процесс повторяется? Очень бы хотелось услышать мнение тех кто сталкивался с подобной проблемой или знает причину такого поведения. Есть ли решение заставить тело цикла в треде выполняться хотя бы раз в 10 мс? Кстати похожая картина наблюдается при установке VCL таймера в значение менее 60 мс, все равно интервал его работы остается 50-60 мс.
547
05 сентября 2006 года
Hydra
488 / / 20.06.2006
Потому что надо Synchronize() для визуальных компонентов использовать
1
05 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=Hydra]Потому что надо Synchronize() для визуальных компонентов использовать[/QUOTE]
Это первое.
Второе - зачем приводить результаты вывода программы - если они никак вопрос не дополняют?
Кроме того, система приоритетов винды гарантирует только то, что поток с высоким приоритетом будет получать процессор в свое распоряжение чаще, чем поток с более низким приоритетом - но никак не гарантирует как часто это будет происходить. Если необходимо иметь высокую точность - нужно использовать мультимедийные таймера - их точность срабатывания лежит гдето в пределах 10-30 мс.
20K
05 сентября 2006 года
rulan
2 / / 05.09.2006
Спасибо за объективную критику. Буду пробовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог