![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
потоки [XP]
Альберт © (2007-10-05 01:28:00)Привет, ребят подскажите, плз, как на WinApi реализовать 2 потока?
Альберт Мобайл (2007-10-05 11:44:00) [1]ребят, спасибо! сейчас попробую!
Альберт Мобайл (2007-10-05 11:42:00) [2]да я только перевел. пытаюсь разобраться. в юр вузе учусь.азы программирования на винапи ищу по инету всему.
чуть позже постараюсь все написать.
итак, 2 потока
первый проверяет наличие чужого окна в системе. isWindow(wnd:hwnd)
2й ловит сообщения созданного моим приложением окна.
примерный код (сейчас не у компа)
function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
begin
case msg of
WM_Destroy:
begin
PostQuitMessage (0);
Result := 0;
Exit;
end;
else
Result := DefWindowProc(wnd,msg,wparam,lparam);
end;
end;
// Ристрация класса окна
begin
window.cbSize := sizeof (window);
window.style := CS_HREDRAW or CS_VREDRAW;
window.lpfnWndProc := @WindowProc;
window.cbClsExtra := 0;
window.cbWndExtra := 0;
window.hInstance := HInstance;
window.hIcon := LoadIcon (0,IDI_APPLICATION);
window.hCursor := LoadCursor (0,IDC_ARROW);
window.hbrBackground:=Color_BtnFace+12;
window.lpszMenuName := nil;
window.lpszClassName := 'Main_Window';
RegisterClassEx (window);
// Создание окна на основе созданного класса
Mwindow := CreateWindowEx(0,'Main_Window','First_WinAPI_Programm', WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil);
// Показать созданное окно
SHOWWINDOW (Mwindow,SW_Show);
// Цикл обработки сообщений
2й используется здесь
while GetMessage (Mmsg,0,0,0) do
begin
TranslateMessage (Mmsg);
DispatchMessage (Mmsg);
end;
Инс (2007-10-05 11:22:00) [3]
> И молиться, молиться, молиться...
А атеистам - ручками выставить IsMultiThread, поместить тело потока в SEH-фрейм и инициализировать FPU.
DiamondShark (2007-10-05 11:15:00) [4]
> или CreateThread на худой конец
И молиться, молиться, молиться...
MBo (2007-10-05 10:50:00) [5]Пишешь минимальное приложение без VCL - создание окна, цикл обработки сообщений.
Таким образом, один (первичный) поток уже есть.
Далее создаешь поточную функцию для дополнительного потока и запускаешь доп. поток функцией BeginThread (или CreateThread на худой конец, заметь, что прототипы поточных функций различаются)
Сергей М. (2007-10-05 10:33:00) [6]
> один поток создает окно и получает сообщения от окна, а
> второй проверяет циклами наличие чужого процесса
А третий чем у тебя занят ?
Впрочем что-то не видно в коде ни "окна", ни "получения сообщения от окна", ни "проверки циклами наличия чужого процесса"
Альберт Мобайл (2007-10-05 10:23:00) [7]один поток создает окно и получает сообщения от окна, а второй проверяет циклами наличие чужого процесса. вроде бы больше пока ничо не нужно. выше с си на дельфи перевод сделал примера, данного о ссылке
MBo (2007-10-05 07:01:00) [8]что должны делать потоки?
Альберт (2007-10-05 02:38:00) [9]{*********************************}
{ Generated by c2pas32 v0.9b }
{ (c) 2001 Oleg Bulychov }
{ Gladiators Software }
{ http://www.astonshell.com/ }
{*********************************}
//unit sex_c;
//interface
uses Windows;
//{$include <windows>}
//{$include <tchar.h>}
//{$include <strsafe.h>}
const
MAX_THREADS = 3;
BUF_SIZE = 255;
const HEAP_ZERO_MEMORY = $00000008;
type
MyData = record
val1: integer;
val2: integer;
end;
//MYDATA = MyData;
PMYDATA = ^MyData;
//implementation
function MyThread(lpParam: pointer): DWORD; stdcall;
var
hStdout: THandle;
pData: PMYDATA;
msgBuf: array [0..Pred(BUF_SIZE)] of CHAR;
cchStringSize: byte;
dwChars: DWORD;
begin
hStdout:= GetStdHandle(STD_OUTPUT_HANDLE);
if hStdout=INVALID_HANDLE_VALUE
then
begin
result:= 1;
exit;
(* Cast the parameter to the correct data type.*)
end;
pData:= {!!!a type cast? =>} {PMYDATA(}lpParam;
//StringCchPrintf(msgBuf,BUF_SIZE,TEXT('Parameters = %d, %d'#13#10''),pData.val1,pData.val2);
(* Print the parameter values using thread-safe functions.*)
// StringCchLength(msgBuf,BUF_SIZE, and cchStringSize);
//WriteConsole(hStdout,@msgBuf,cchStringSize,dwChars,0{nil});
begin
result:= 0;
exit;
end;
end;
function _tmain(): integer;
var
pData: PMYDATA;
dwThreadId: array [0..Pred(MAX_THREADS)] of DWORD;
hThread: PWOHandleArray;//array [0..Pred(MAX_THREADS)] of THandle;
i: integer;
begin
for{while} i:=0 to Pred(MAX_THREADS) { i++ }
do
begin
pData:= {!!!a type cast? =>} {PMYDATA(}HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(MYDATA));
if pData=nil
then begin messagebox(0,'','',0);
ExitProcess(2);
messagebox(0,'','',0);
end;
pData.val1:= i;
pData.val2:= i+100;
hThread[i]:= CreateThread(0{nil},0,@MyThread,pData,0, dwThreadId[i]);
if hThread[i]=0{nil}
then
end;
begin
for{while} i:=0 to Pred(MAX_THREADS) { i++}
do
begin
if hThread[i]<>0{nil}
then
begin
CloseHandle(hThread[i]);
end;
end;
HeapFree(GetProcessHeap(),0,pData);
ExitProcess(i);
end;
WaitForMultipleObjects(MAX_THREADS,hThread,LongBool(1),INFINITE);
for{while} i:=0 to Pred(MAX_THREADS) { i++}
do
begin
CloseHandle(hThread[i]);
end;
HeapFree(GetProcessHeap(),0,pData);
begin
result:= 0;
exit;
end;
end;
begin
_tmain;
end.
перевел.. не так что-то
Zeqfreed (2007-10-05 01:33:00) [10]http://msdn2.microsoft.com/en-us/library/ms682516.aspx