Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

CreateThread !   Найти похожие ветки 

 
DoG ©   (2004-04-10 12:21) [0]

Здравствуйте !

Проблема такая :
Почему ниженаписанный код  который в ремарках работает, но один раз ,а дальше не хочет , а который бер ремарки воьще не работает !
Мне вобще нужно время сделаль, может какой-н бругой способ есть ?
какой !
И что у меня сдесь неправильно т.к. срабатывает всего 1 раз !
...
var
 Form1: TForm1;
 Tim : _SYSTEMTIME ;
 hrs : String ;
 ID : Cardinal;
 hThread : HWND;
implementation

{$R *.dfm}

procedure SetTime;
begin
{
 GetLocalTime(Tim);
 hrs := IntToStr(Tim.wHour)+":"+IntToStr(Tim.wMinute)+":"+IntToStr(Tim.wSecond);
 SetWindowText(Form1.Handle,PChar(hrs));
}
 Form1.Canvas.TextOut(random(100),random(100),"Hi!");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
hThread := CreateThread(nil,0,@SetTime,nil,0,ID);
end;
end.

Спасибо !


 
Digitman ©   (2004-04-10 12:33) [1]

а зачем тебе здесь вообще понадобился thread ? чем это обосновано ? или это учебная задача ?

если учебная, возьми готовый класс TThread и не мучайся
пример использования этого класса для организации вычислений в доп.потоке есть в демо-проекте в каталоге Demos\Threads\


> т.к. срабатывает всего 1 раз


1 раз вызвал ф-цию SetTime - 1 раз  и получил результат
а ты как хотел иначе ?


 
Verg ©   (2004-04-10 13:04) [2]

Из того, что видно невооруженным глазом -

procedure SetTime;

Надо бы

function SetTime(lpParameter : pointer):DWORD; stdcall;


 
Cobalt ©   (2004-04-10 14:42) [3]

Который без ремарки - просто он сразу же затирается.

А поток создаётся второй раз? Короче говоря - отлаживайте код.
CreateThread

Return Values

If the function succeeds, the return value is a handle to the new thread.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.


 
Songoku ©   (2004-04-10 16:20) [4]

2 DoG:
Кароче всё очень просто!! ГА ГА ГА ... я просто смеюсь!
Посмотри в MSDN портатип функции ThreadFunk ...

function SetTime(lpZero:DWORD):DWORD; stdcall;
begin

Form1.Canvas.TextOut(random(100),random(100),"Hi!");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CloseHandle(CreateThread(nil,0,@SetTime,nil,0,ID));
end;
end.


 
Digitman ©   (2004-04-10 16:36) [5]


> Кароче всё очень просто!! ГА ГА ГА ... я просто смеюсь!


не рано ли ржешь ? не будет твой код работать


 
Songoku ©   (2004-04-10 16:43) [6]

2 Digitman © : почему???
Если чесно я не тестировал! У меня компилятора нету, Я по памяти - но я уверен на 100% что всё будет ок.
Я магу даже обьяснить. Почему у него тот код не работал.
Когда ...
procedure SetTime;
завершалась она переходила в вункцию каторая запусила этот поток.
А при выходе SetTime не отчищала стэк. Из за этого esp увееличелось на 4(Адресс от куда вызволи функции), а должно было на 8 byte. И из за этого произошла где то ошибка.


 
DoG ©   (2004-04-10 16:53) [7]

1.По повобу взять готовый класс, я пишу прогу на чистом API так что эта идея отпадает !

2.Я понял что вызывая 1раз функ SetTime и она выполняется 1 раз,тогда скажите как сделать что бы она выполнялас все время (может что-то дописать надо?) как TThread Execute, я просто не могу понять принципа этой функции как она робит .

3.Ну и так для интереса, как реализовать обычные часы на API т.е.
я это сделал в функц SetTime но как быть таймером как его установить (пробовал не получается), подскажите !


 
Songoku ©   (2004-04-10 16:59) [8]

2 DoG ©

безконечный цыкл!
begin
while true do
begin

/.....
end;
end;

Ты хочешь сделать обычные часы???


 
Digitman ©   (2004-04-10 17:06) [9]


> Songoku ©   (10.04.04 16:43) [6]


дело не в стеке и нарушении у автора соглашения о вызове и прототипе поточной ф-ции

поточная ф-ция доп.потока не имеет права обращаться к потоконебезопасным VCL-объектам, это ведет к исключительной ситуации, которая в твоем примере даже не никак не обрабатывается

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


 
Digitman ©   (2004-04-10 17:09) [10]


> DoG ©   (10.04.04 16:53) [7]


так и непонятно до сих пор, для чего тебе доп.код.поток понадобился


 
Digitman ©   (2004-04-10 17:12) [11]


> пишу прогу на чистом API


..и при этом откуда-то взялось вот это

Form1.Canvas.TextOut()

это что, тоже "чистый API" ? как сие понимать ?


 
Songoku ©   (2004-04-10 17:12) [12]

2 Digitman ©:
Не может быть ... сколько раз такое дала и всё нормально!
А во вратых ... он пишет программу на чисто на API ... а значит Классов он испоьзовать не будет!
НО всё равно то что ты говаришь это полный бред.
Я этого не понимаю ... вот смотри эти два птока разделяю одно и тоже адресное пространство! А значит что все глобальные переменные общие и тут не может возникнуть проблемм.
Ну ты хоть пробывал скомпилировать .. мой пример???
Вот скомпилируй и посмотри .. я не пробывал но я увере на 10% что всё будет ОК.


 
Digitman ©   (2004-04-10 17:31) [13]


> Ну ты хоть пробывал скомпилировать .. мой пример???
> Вот скомпилируй и посмотри


даже и компилировать не буду, потому что это работать не будет, почему - я уже тебе сказал

ты мозгами-то чуть пораскинь, прежде чем про какое-то там "адресное пространство" лабуду плести)

вот цитата автора :

Почему ниженаписанный код  который в ремарках работает.. , а который бер ремарки воьще не работает !

о чем это говорит ? да о том , что процедура SetTime() успешно вызвана на выполнение ! И неважно в дан.случае, вызвана не функция, как это требуется, и что нарушены соглашение о stdcall-вызове.. эта проблема даст о себе знать уже ПОСЛЕ возврата из SetTime() .. а пока выполняется тело, проблем в "закомментированном" варианте нет, и это видно по успешному выполнению SetWindowText(), а вот в "НЕзакомментированном" варианте возникает как раз то самое исключение, о котором я тебе уже сказал ... необработанное же в контексте поточной ф-ции исключение ведет к непредсказуемым последствиям для процесса в целом !


 
Digitman ©   (2004-04-10 17:34) [14]


> Классов он испоьзовать не будет


RTTI-классы как таковые отнюдь не обязательно означают VCL
а я пока не вижу, что VCL таки используется .. и используется неверно .. иначе на кой шут задавать вопрос о неработающем варианте с обращением к канве ?


 
Digitman ©   (2004-04-10 17:39) [15]


> а я пока не вижу


пардон ...читать так - "я пока вижу, что VCL автором используется, несмотря на заявление о чистом API"


 
Songoku ©   (2004-04-10 17:41) [16]

2 Digitman ©:
Ну не знаю ..... я сохраню этот пример... и посматрю что там рпоисходит!


 
Songoku ©   (2004-04-10 17:42) [17]

ты мозгами-то чуть пораскинь, прежде чем про какое-то там "адресное пространство" лабуду плести)
Ой ... я вполне знаю что это обазначает! У меня уже есть опыт написаня драйверов.


 
Digitman ©   (2004-04-10 17:45) [18]


> У меня уже есть опыт написаня драйверов


да на здоровье ! пиши себе драйверы сколько душе угодно ! но никогда в своих драйверах не обращайся в доп.код.потоках к потоконебезопасным объектам VCL !


 
Songoku ©   (2004-04-10 17:50) [19]

2 Digitmat :
Упоси боже .... DELPHI И KERLEN MODE это 2 несовместимые вещи :)))


 
Digitman ©   (2004-04-10 17:55) [20]


> DELPHI И KERLEN MODE это 2 несовместимые вещи


глупости

ничто не мешает разрабатывать отдельные логически завершенные фрагменты драйвера в среде Делфи

и конкретный CPL, с котором те или иные п/программы, созданные в Делфи, м.б. потенциально вызваны, не имеет к этому ни малейшего отношения


 
Songoku ©   (2004-04-10 17:59) [21]

2 Digitman © :
Да знаю я это!!! Я имелл веду что на Delphi не льзя написать драйвер! Delphi так же может через DeviceIoControl работать с драйверами :P


 
Digitman ©   (2004-04-10 17:59) [22]

к чему ты вообще про драйверы загнул в то время как речь идет о прикладной задаче - вообще непонятно


 
Digitman ©   (2004-04-10 18:01) [23]


> Я имелл веду что на Delphi не льзя написать драйвер!


и к чему этот комментарий ? это откровение ? ты страшную тайну открыл кому-то ?


 
Songoku ©   (2004-04-10 18:02) [24]

Дапотому что ты из себя всё знайку сторишь!!!
Стыдно за тебя ....


 
Digitman ©   (2004-04-10 18:10) [25]


> Стыдно за тебя


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

заодно постыдился бы и свой русский


 
Songoku ©   (2004-04-10 18:16) [26]

2 Digitman:
Не зажто мне стыдится .. потому что я живу там где русский не нужен! А писать я сдецтва не умел. Я вот ... дамой приду и посмотрю в чём там проблема была ....


 
Digitman ©   (2004-04-10 18:23) [27]


> DoG ©   (10.04.04 16:53) [7]


видишь ли, основной поток приложения, использующего VCL, должен иметь монопольное право на работу с канвой различных оконных контролов .. так что, если осн.поток длительно занят в момент срочной необходимости нарисовать что-то на канве thread тебе здесь никак не поможет - он не имеет права самостоятельно рисовать на канве, которую создал и которой "владеет" осн.код.поток

если же ты не используешь VCL, а пытаешься творить на "чистом API", то в любом случае для "рисования" несколькими код.потоками на DC некоего (одного и того же) окна тебе необходимо предусматривать хоть какую-то синхронизацию доступа к этому DC со стороны более чем одного код.потока


 
DoG ©   (2004-04-10 19:19) [28]

Народ ! Вы все запуталить или я вас запутал !

Да ,Я пишу прогу на чистом API, но то что я написал это не она ,и мне не надо обращатся к канве ! Все началось так :
Мой препод сказал мне написать прогу которая создает  N процессов по желанию пользователя ,а конкретно маленькая формочка с часами. Ну я и сделал мал форму с часами в метке (на быструю руку), а препод посмотрел сколько она весит и сказал 30Кб не больше должна т.е. переписывать на API надо. Ну я все переписал, а че с часами то делать ? начал копать как время  достать на API ну и нашел (SetTime), ну отобразить отобразил, как сделать чтобы тикали НЕЗНАЯ (вот что и пытаюсь узнать). Давай с таймером разбираться тыкался тыкался так и нечего и не вышло, и после 2-3 часов подумал может на поток это дело повесит и все путем, НУ вот взялся за поток с ним разбирался че куда и уперся в то что он один раз выполняет , ето гдето 8 часов я уже просидел с этим API  голова совсем не варит и про то что зациклить это дело надо, совсем забыл, думал что что то с SetTime не так, ну и давай что нить для проверки другое по проще ну и влепил канву и для уверенности еще новый проект создал !
Вот так дело было !
1. С нитью я все понял !
2. Как рационально, часы в моем случае сделать ?
3. Как таймер на API запустить(интересно) ?


 
Polevi ©   (2004-04-10 19:28) [29]

SetTimer, TimerProc


 
DoG ©   (2004-04-10 19:54) [30]

Да ,Я понимаю что SetTimer, но сколько я не пробовал рузультат НОЛЬ !
можно хотябы элементареый пример ?


 
Polevi ©   (2004-04-10 20:12) [31]

F1 на SetTimer нажимал ?


 
Yozh_Programmer ©   (2004-04-10 20:44) [32]

Если тебе сойдет использовать вместо канвы лейбл, то вот на чекни это код, у меня пашет без проблем


function ThreadFunc( var data : Pointer ) : DWORD; stdcall;
var st : SYSTEMTIME;
begin
//
   while true do
   begin
       Sleep( 500 );
       GetLocalTime( st );
       Form1.Label1.Caption := IntToStr( st.wHour ) + "h " + IntToStr( st.wMinute ) + "m " + IntToStr( st.wSecond ) + "s";
       Form1.Label1.Update();
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var tid : Cardinal;
   hThread : Cardinal;
begin
//
   hThread := CreateThread( nil, 0, @ThreadFunc, nil, 0, tid );
end;


 
Игорь Шевченко ©   (2004-04-10 20:48) [33]


> Мой препод сказал мне написать прогу


Насколько я понимаю, остальным участникам форума препод этого не говорил...


 
DoG ©   (2004-04-10 21:12) [34]

Нажимал !
SetTimer(HWnD,nil,1000,@SetTime);
ТАК ? Не работает !
КАК ?


 
Polevi ©   (2004-04-10 21:29) [35]

и что такое @SetTime  в твоем коде ? объясни если читал
нет под рукой хелпа но похожн что @SetTime это адрес ф-ии SetTime в Win32 API. то есть ты написал бред, советую сначала думать а помто писать. последним параметром в SetTimer надо передать адрес твоей ф-ии, декларация в хелпе, помоему TimerProc


 
Polevi ©   (2004-04-10 21:33) [36]

>Yozh_Programmer ©   (10.04.04 20:44) [32]
не надо так писать, тем более другим советовать
объяснсть почему не юуду, устал уже одно и тоже повторять, почитай форум, Digitman (снимаю шляпу) в очередной раз разжевал в какойто ветке недавно


 
Alexander666 ©   (2004-04-10 21:48) [37]

А Петзольда или Румянцева не судьба почитать? У них там даже примеры есть.


 
DoG ©   (2004-04-11 11:10) [38]

>А Петзольда или Румянцева не судьба почитать? У них там даже примеры есть.

И где я их найду этих ....


 
Alexander666 ©   (2004-04-11 11:24) [39]

Румянцева я не помню где брал, а вот Петзольда отсюдова http://www.proglib.ru/books.asp?page=4



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.026 c
1-1081758981
Dima S
2004-04-12 12:36
2004.05.02
StringGrid


3-1080926502
neVIP
2004-04-02 21:21
2004.05.02
Что такое IB и с чем его едят...


1-1081921535
Laymer
2004-04-14 09:45
2004.05.02
Даты


14-1081438044
TButton
2004-04-08 19:27
2004.05.02
Мониторинг сети


1-1081942853
ЁПРСТ
2004-04-14 15:40
2004.05.02
Почему OnMouseWheel срабатывает три раза?