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

Вниз

Вопрос по потокам   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.064 c
14-1130184262
Volodya
2005-10-25 00:04
2005.11.20
Переполнение йомкости для отработаного чернила


4-1127114536
Руслан
2005-09-19 11:22
2005.11.20
А можно ли программно из Windows


4-1127217125
Sesh
2005-09-20 15:52
2005.11.20
ReadOnly в Приложении


14-1130479491
Некто
2005-10-28 10:04
2005.11.20
Джаз


5-1111501905
DmitryS
2005-03-22 17:31
2005.11.20
TListView & TTreeView