Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.054 c
1-1130404644
Walker
2005-10-27 13:17
2005.11.20
Интерфейс: построитель выражений


14-1130575148
Del_programmer
2005-10-29 12:39
2005.11.20
ирк


2-1130483841
Dron_
2005-10-28 11:17
2005.11.20
Удаление символов из строки


2-1130797663
Старт
2005-11-01 01:27
2005.11.20
Какую кнопку можно настроить так, чтобы при наведении на неё мыши


14-1130078980
alexsis
2005-10-23 18:49
2005.11.20
Михаил Задорнов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский