Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.036 c
14-1081426797
lepton77
2004-04-08 16:19
2004.05.02
А где новые дайджесты форумов?


1-1081941918
Cr@zy-EyE
2004-04-14 15:25
2004.05.02
Создаю объект в initialization, а в юните его не видно


14-1081324648
asm???
2004-04-07 11:57
2004.05.02
Программка на ассемблере


14-1081224495
Vlad Oshin
2004-04-06 08:08
2004.05.02
Уважаемые Питерцы! Помогите с жильем...


1-1081798973
Nekto
2004-04-12 23:42
2004.05.02
Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский