Форум: "Потрепаться";
Текущий архив: 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