Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2007, 15:23   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию Передача параметра в поток

Суть в чём, пишу прогу - музыкальный редактор музыки на бипере, хочу, чтобы были кнопки Play Pause и Stop, поэтому создаю поток с процедуры проигрывания, находящейся в модуле, она принимает строку, по содержанию что-то вроде нот как в ранних прогах на сотовых, причем не внутри потока все работает нормально, пытался передавать как параметр просто указатель на строку, но проигрывалась или белеберда или ниче не проигрывалось,
пробовал переделать процедуру и сделать входным параметром указатель, а уже в самой процедуре преобразовывать его в стоку, но опять ноль результата. Процедуру не перегружал, а дал им разные названия: той, что по указателю и оригиналу
Поэтому возникает вопрос: в чем может быть проблема?

P.S. поток создаю ф-ей beginthread из SysUtils а не createthread из Windows
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился

Последний раз редактировалось joker; 18.12.2007 в 15:27.
joker вне форума Ответить с цитированием
Старый 18.12.2007, 15:55   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

ну так юзайте тогда TThread раз не апи
BOBAH13 вне форума Ответить с цитированием
Старый 18.12.2007, 19:39   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

лучше приведи код с помощью которого вызываешь поток и как в потоке обрабатываешь строку?
rpy3uH вне форума Ответить с цитированием
Старый 19.12.2007, 12:28   #4
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

короче на васме мне объяснили прописную истину, что переменная должна быть глобальной, чтобы её в поток передавать и из-за моей тупости оказались правы :-)
У меня возникло два вопроса:
Есть ли разница для beginthread где объявлена переменная в implemetation
или interface?
Как смастерить аналог свойства Terminated обьекта TTread в дельфи на winAPI, небось в самом объекте просто постоянно обращаются к таблице запущенных потоков каким-нибудь из способов?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 19.12.2007, 13:26   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

после implementation доступ только в юните данном, если выше то те юниты, которые подключили данный, так же имеют доступ к ней )

Terminated - это всеголиш Boolean :D просто в в потоке цикл - пока оно true то работаем, если нет, то досвидания )))
BOBAH13 вне форума Ответить с цитированием
Старый 19.12.2007, 16:06   #6
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Не, а как отследить конец потока, я пробовал в модуле в процедуре потока поставить изименение глобальной булиновской модульской переменной, вначале потока в фолс, в конце в тру, и в самом приложении создал следящий поток (паранойя, конечно, но чё поделать, как-то нужно после завершения проигрывания энаблить кнопку плей и дизаблить паузу и стоп), в котором ждет пока не завершится поток проигрывания именно благодаря этой переменной, а потом делает свое дело, но почему-то не пашет, может дело в том, что поток не видит: либо переменную модуля, либо переменную формы, хотя к кнопкам я обращался через Form1.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 19.12.2007, 19:30   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

боже мой... я имел ввиду типа

unit

...

var
Term: Boolean = False;

implementation

...

procedure execute;
var
...
begin
...
while not Term do
...
end;


Килл данный поток просто Term := True; Вот и все... цикл окончится и досвидания
BOBAH13 вне форума Ответить с цитированием
Старый 19.12.2007, 19:58   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

у класса TThread есть свойство Handle, в котором содержится хендл твоего потока, используешь API функцию TerminateThread и передаёшь ей хендл твоего потока.

TerminateThread(MyThread.Handle,0);
rpy3uH вне форума Ответить с цитированием
Старый 21.12.2007, 10:02   #9
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Я имею ввиду, что поток не бесконечный. Создал его, и не знаешь, когда он завершится, помимо булиновской переменной, с помощью вин апи можно ли обратится к хендлу потока и узнать завершился он уже или ещё нет?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 21.12.2007, 17:22   #10
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

первый вариант: запустить и ждать.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  thrID:DWORD;
  thrhandle:thandle;
begin
 thrhandle:=CreateThread(0,0,@threadproc,0,0,thrID);
 WaitForSingleObject(thrhandle,INFINITE);
 ShowMessage('он завершился');
end;
вариант номер два: пробовать получить его код выхода. Когда поток активен, то его код выход равен STILL_ACTIVE
Код:
procedure ThreadProc(p:DWORD);   
begin
  sleep(3000);
  MessageBox(0,'поток окончен','сообщение потока',0);
end;

var
  thrID:DWORD;
  thrhandle:thandle;

procedure TForm1.Button1Click(Sender: TObject);

begin
 thrhandle:=CreateThread(0,0,@threadproc,0,0,thrID);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  exitcode:DWORD;
begin
  GetExitCodeThread(thrhandle,exitcode);
  if exitcode=STILL_ACTIVE then ShowMessage('поток существует');
end;
третий вариант: пробовать получить его контекст, если результат успешен, то поток ещё сущетсвует.
Код:
procedure ThreadProc(p:DWORD);
begin
  sleep(3000);
  MessageBox(0,'поток окончен','сообщение потока',0);
end;

var
  thrID:DWORD;
  thrhandle:thandle;

procedure TForm1.Button1Click(Sender: TObject);

begin
 thrhandle:=CreateThread(0,0,@threadproc,0,0,thrID);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  f:CONTEXT;
begin
  if GetThreadContext(thrhandle,f) then ShowMessage('поток существует');
end;
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача компонента как параметра в функцию hayhay Microsoft Office Excel 1 11.03.2008 15:53
Как сделать выбор параметра запроса из таблицы valery Microsoft Office Access 1 30.11.2007 11:17
Передача параметра компаненту на другой форме. Kukkk Компоненты Delphi 1 28.09.2007 00:31
Помогите с чтением параметра в реестре!! snake-as Общие вопросы Delphi 2 14.03.2007 15:50