Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизВопрос по потокам Найти похожие ветки
← →
zaN0za © (2005-10-27 18:41) [0]здравствуйте, уважаемые мастера.
у меня такой пример:
создаю 2 потока.
в 1-м потоке бесконечный цикл.
во 2-м потоке функция, принимает параметры и в зависимости от параметра
завершает программу.
2-й поток принимает параметры, если не создавать 1-й.
1-й же работает при любых условиях.
вопрос: Почему так?
Спасибо за внимание.
← →
Leonid Troyanovsky © (2005-10-27 18:50) [1]
> zaN0za © (27.10.05 18:41)
> 2-й поток принимает параметры, если не создавать 1-й.
> 1-й же работает при любых условиях.
>
> вопрос: Почему так?
Очевидно, что работа первого потока препятствует приему
параметров вторым.
Возможно, что виной тому бесконечный цикл, однако исключить
неверный способ передачи параметров второму тоже нельзя.
--
Regards, LVT.
← →
zaN0za © (2005-10-27 19:17) [2]
> Leonid Troyanovsky © (27.10.05 18:50) [1]
только что набросал... примерно так
пример:
program primer;
uses windows;
var
hndl : DWORD;
procedure _loop;
begin
While true do
... какие-то действия ...
end;
procedure msg(p:pointer);
var
lparam : PChar;
begin
lparam := PChar(p^);
if lparam = "exit" then Halt;
if lparam = "msg" then MessageBox(0,lparam,"info",0);
end;
procedure set_msg;
var
h1: DWORD;
lparam : PChar
begin
CreateThread(nil, 0, @msg, @lparam, 0, h1);
end;
begin //main
CreateThread(nil, 0, @msg, nil, 0, h1);
CreateThread(nil, 0, @_loop, nil, 0, h1);
end.
← →
zaN0za © (2005-10-27 19:19) [3]извините, поспешил:
begin //main
CreateThread(nil, 0, @set_msg, nil, 0, h1); //!!!!!!!!!
CreateThread(nil, 0, @_loop, nil, 0, h1);
end.
← →
zaN0za © (2005-10-27 19:20) [4]+ sleep(infinite)
← →
Sumor (2005-10-27 22:55) [5]1. Описание функции, которую ты используешь для нити должна быть такой:
procedure msg(p:pointer);winapi;
Лучше если и остальные функции, которые ты используешь, но не передаёшь параметры имела такой же видprocedure set_msg(p:pointer);winapi;
2. PChar уже сам по себе указатель, поэтому если ты хочешь передать через него строчку то его можно указывать и получать напрямую:
procedure msg(lparam : PChar);
begin
if lparam = "exit" then Halt;
if lparam = "msg" then MessageBox(0,lparam,"info",0);
end;
procedure set_msg;
var
h1: DWORD;
lparam : PChar;
begin
lparam := "msg";
CreateThread(nil, 0, @msg, lparam, 0, h1); // lparam вместо @lparam
end;
3. Переменные при завершении функции уничтожаются. Поэтому если ты передаёшь указатель на локальную переменную (@lparam) ты должен быть уверен что эти данные прочитаются до того, как завершиться функция.
Если set_msg завершится быстрее чем ты выполнишь p^, то у тебя будет access violation
C уважением Sumor
← →
Leonid Troyanovsky © (2005-10-28 08:52) [6]
> zaN0za © (27.10.05 19:17) [2]
> пример:
В печь его.
Объясни словами, что ты хочешь.
RTFM: TThread, или, на самый худой конец, BeginThread.
Во-вторых, если CreateThread использован лишь для того, чтобы
иметь место в этой конференции, то здесь я беседовать не буду,
бо офтопично.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-10-28 08:54) [7]
> Sumor (27.10.05 22:55) [5]
> 1. Описание функции, которую ты используешь для нити должна
> быть такой:
> procedure msg(p:pointer);winapi;
Чушшшшшшшшь (TT ©).
--
Regards, LVT.
← →
Sumor (2005-10-28 21:11) [8]
> > Sumor (27.10.05 22:55) [5]
> > 1. Описание функции, которую ты используешь для нити должна
>
> > быть такой:
> > procedure msg(p:pointer);winapi;
>
>
> Чушшшшшшшшь (TT ©).
>
> --
> Regards, LVT.
обоснуй, почему чушь? Это работает и это правильно.
← →
tesseract © (2005-10-28 21:26) [9]
> обоснуй, почему чушь? Это работает и это правильно.
А что за параметр такой winapi ??? Моя delphi его не знает.
Дядя леня прав на все 64h !!!!
← →
Baltika-23 (2005-10-28 21:33) [10]
program Project2;
{$APPTYPE CONSOLE}
uses
windows,
SysUtils;
var
tId,h1,h2: THandle;
s: String;
procedure _loop; stdcall;
begin
while True do Sleep(0);
end;
procedure Msg(p: Pointer); stdcall;
var
i: Integer;
ps: PChar;
begin
ps := p;
for i := 1 to 10 do
begin
WriteLn(ps+" "+IntToStr(i));
Sleep(1000);
end;
ExitThread(0);
end;
begin
s := "Message";
h1 := CreateThread(nil,0,@Msg,PChar(s),0,tId);
h2 := CreateThread(nil,0,@_loop,PChar(s),0,tId);
WaitForSingleObject(h1,INFINITE);
CloseHandle(h1);
TerminateThread(h2,0);
CloseHandle(h2);
end.
← →
Defunct © (2005-10-29 01:15) [11]tesseract © (28.10.05 21:26) [9]
> Дядя леня прав на все 64h !!!!
LOL, надо запомнить!
>Baltika-23 (28.10.05 21:33) [10]
Да уж, логика примера - просто пинцет, как и задумка автора.
что мешает все это сделать в основном потоке?
Мой пример гораздо проще и делает тоже самое, что и Ваш:program Project1;
{$APPTYPE CONSOLE}
var
i : integer;
begin
for i := 1 to 10 do
begin
WriteLn("message" + IntToStr(i);
Sleep(1000)
end
end.
Здается мне, что и задачу автора можно решить без каких-либо доп. потоков.
> zaN0za © (27.10.05 18:41)
у меня такой пример:
создаю 2 потока.
в 1-м потоке бесконечный цикл.
во 2-м потоке функция, принимает параметры и в зависимости от параметра
завершает программу.
Жирным выделен смысл вашей затеи.
Так делать нельзя.
Выбрось этот пример и забудь.
← →
Baltika-23 (2005-10-29 01:47) [12]>Defunct © (29.10.05 01:15) [11]
Да уж, логика примера - просто пинцет, как и задумка автора.
что мешает все это сделать в основном потоке?
А мешает это сделать одна маленькая деталь - автору нужен пример, как правильно создвать создвать потки, передавать туда параметры.
Поэтому твой ехидный - мягко назовем его - пример, неуместен и неудачен в контексте топика.
Жирным выделен смысл вашей затеи.
Так делать нельзя.
Выбрось этот пример и забудь.
Бред.
В зависимости от задачи такое решение может быть совершенно нормальным.
То, что ты не знаешь такой задачи, еще не значит, что ее не может быть.
← →
Defunct © (2005-10-29 02:42) [13]Baltika-23 (29.10.05 01:47) [12]
Нижайше прошу извинить за то, что неоправдано задел Ваше самолюбие упростив Ваш рабочий пример. У меня нет сомнений в том, что Вы владеете механизмами работы с потоками.
Хочу обратить Ваше внимание на то, что упор я старался сделать не на Ваши умения и таланты, и не на то чтобы Вас оскорбить или задеть, а на то, что затея автора не стоит Вашего времени. (похоже не получилось). Затея автора возможно решается гораздо проще.. Еще раз прощу прощения.
>> Жирным выделен смысл вашей затеи.
>> Так делать нельзя.
>> Выбрось этот пример и забудь.
> Бред.
> В зависимости от задачи такое решение может быть совершенно нормальным.
полагаю придрались к выделенной фразе?
напомню только:
1. Задача любой произвольной функции в Delphi - возвращать результат. В противном случае используются процедуры.
2. Завершение программы из дополнительного потока можно только инициализировать, но не выполнить, в противном случае (в многопоточном приложении) возможны сбои в логике работы других потоков, потеря данных и утечки системных ресурсов.
> То, что ты не знаешь такой задачи, еще не значит, что ее не может быть.
Соломонова фраза. ;>
← →
Sumor (2005-10-29 13:30) [14]
> А что за параметр такой winapi ??? Моя delphi его не
> знает.
Ну а моя знает. На самом деле это stdcall и есть.
Маленький вопрос теперь от меня:
> procedure _loop; stdcall;
> begin
> while True do Sleep(0);
> end;
>
это нормально что CreateThread нужна процедура с параметром, а мы передаём ей указатель на функцию без параметра? Насколько я понимаю в стеке будет лишний параметр, который оттуда не вынется, только я не могу оценить может ли это привести к чему-то плохому.
← →
Leonid Troyanovsky © (2005-10-31 10:13) [15]
> Sumor (29.10.05 13:30) [14]
> это нормально что CreateThread нужна процедура с параметром,
> а мы передаём ей указатель на функцию без параметра? Насколько
DWORD WINAPI ThreadProc( LPVOID lpParameter);
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c