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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2013, 10:03   #1
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию Работа с потоками.

Работа с потоками.

Хочу научиться работать с потоками на WinApi. Программу компилирую в Лазарусе.

Вот код, который я использую:
Код:
uses windows;
procedure ThisIsTheThread1;
begin
	winexec('notepad.exe',sw_show);
end;
var
	ThreadID : dword;
	HThread1 : THandle;
begin
	hThread1 := CreateThread(nil, 0, @ThisIsTheThread1, nil, 0, ThreadID);
	if hThread1 <> Null then
	SetThreadPriority(hThread1, THREAD_PRIORITY_NORMAL);
	CloseHandle(hThread1);
end.
Возникает Runtime error 217:

Но при этом notepad.exe запускается!
А если убрать строчку "if hThread1 <> Null then", то Runtime error не вылетает, но и notepad.exe не запускается.
Помогите устранить ошибку, чтобы всё корректно работало.

Последний раз редактировалось crazygoldbullet; 24.02.2013 в 11:35.
crazygoldbullet вне форума Ответить с цитированием
Старый 24.02.2013, 10:52   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

CloseHandle(hThread1);
Зачем делаешь? Убери.

P.S. Создание треады для запуска блокнота в качестве обучения моветон. Лучше в доппотоке проведи какие нить вычисления типа сортировки пузырьком массива.
I'm learning to live...

Последний раз редактировалось Stilet; 24.02.2013 в 10:54.
Stilet вне форума Ответить с цитированием
Старый 24.02.2013, 11:33   #3
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию

Вот сделал сортировку пузырьком массива, вывод результата в файл.
Код:
uses windows;
function IntToStr(Value: integer): string;
begin
	System.Str(Value, result);
end;
procedure ArrayToTxt(a:string);
var
	f:text;
begin
	assign(f,'1.txt');
	append(f);
	writeln(f,a);
	close(f);
end;
procedure ThisIsTheThread1;
var 
	i, j, temp: integer;
	A: array[1..5] of integer;
begin
	randomize;
	For i:=1 to 5 do
		A[i]:=random(9);
	For i:=1 to 5 do
	begin
		For j:=5 downto i do
			if A[j] > A[j+1] then
			begin
				temp := A[j];
				A[j] := A[j+1];
				A[j+1] := temp;
			end;
	end;
	For i:=1 to 5 do
		ArrayToTxt(IntToStr(A[i]));
end;
var
	ThreadID : dword;
	HThread1 : THandle;
begin
	hThread1 := CreateThread(nil, 0, @ThisIsTheThread1, nil, 0, ThreadID);
	if hThread1 <> Null then
	SetThreadPriority(hThread1, THREAD_PRIORITY_NORMAL);
end.
Убрал "CloseHandle(hThread1);", как ты и сказал. Это ничего не изменило Проблема осталась та же + сейчас ещё и результат в файл не выводится. А если без потока вызывать процедуру "ThisIsTheThread1", то всё прекрасно работает. А через поток не получается...

Последний раз редактировалось crazygoldbullet; 24.02.2013 в 11:41.
crazygoldbullet вне форума Ответить с цитированием
Старый 24.02.2013, 11:55   #4
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию

UI помог разобраться с проблемой. Правильно действовать нужно было так:
Код:
uses windows;
function ThisIsTheThread1(param: Pointer) : integer; stdcall;
begin
    winexec('notepad.exe',sw_show);
    result := 0;
end;
 
var
    ThreadID : dword;
    HThread1 : THandle;
begin
    hThread1 := CreateThread(nil, 0, @ThisIsTheThread1, nil, 0, ThreadID);
    if hThread1 <> 0 then
    begin
		WaitForSingleObject(hThread1, INFINITE); // Дождался завершения выполнения
		CloseHandle(hThread1); // убил поток
    end;
end.
crazygoldbullet вне форума Ответить с цитированием
Старый 24.02.2013, 15:16   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Дождался завершения выполнения
Уверен? Что-то я не припомню что winexec ожидает завершения процесса...
Цитата:
Это ничего не изменило
Правильно, потому что твой главный поток не дожидаясь завершается. Это ты уже исправил с помошью WaitForSingleObject(). Так что все правильно.
На всякий случай посоветую использовать более надежный TThread, который к тому же еще и кроссплатформенный.
I'm learning to live...

Последний раз редактировалось Stilet; 24.02.2013 в 15:24.
Stilet вне форума Ответить с цитированием
Старый 24.02.2013, 17:58   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от crazygoldbullet Посмотреть сообщение
CloseHandle(hThread1); // убил поток
Закрытие хэндла не убивает поток.
Somebody вне форума Ответить с цитированием
Старый 11.04.2013, 17:07   #7
consthab2
Новичок
Джуниор
 
Регистрация: 11.04.2013
Сообщений: 3
По умолчанию Простой но законченный пример

Думаю этот пример обязательно вам поможет. Статья о проблеме синхронизации потоков на примере простой программы в несколько строк. Код на С++, но используются только API функции.
http://strongcpp.blogspot.ru/2013/04/blog-post.html
Если что-то в примере не поймете - пишите.
consthab2 вне форума Ответить с цитированием
Старый 13.04.2013, 18:27   #8
QunneD
C++ &amp;amp; PHP &amp;amp; Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

На будущее, вместо WinExec используйте CreateProcess.
QunneD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками -Jack- Общие вопросы Delphi 3 12.02.2013 23:21
работа с потоками MetR Помощь студентам 1 04.12.2011 01:32
Работа с потоками den49 Помощь студентам 0 06.10.2009 14:52
Работа с потоками Нюська Общие вопросы Delphi 3 27.05.2009 00:52
C++, работа с потоками mat90x Помощь студентам 20 15.05.2008 22:20