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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2015, 18:28   #1
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию CreateThread и DLL

Здравствуйте, пытаюсь создать поток из дллки, ThreadFunc вообще не вызывается, как быть?

Код:
library Blabla;

uses
  windows,
  Messages;

function ThreadFunc(Param: pointer):dword;stdcall
begin
  messagebox(0,'blabla','',0);
end;

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;

procedure CreateWinApiForm;
begin
  //...
  ShowWindow(Form,SW_MAXIMIZE);
end;

begin
  CreateWinApiForm;
  BeginThread(nil,0,@ThreadFunc,nil,0,thrid);

  while getmessage(mmsg,0,0,0) do
  begin
    translatemessage(mmsg);
    dispatchmessage(mmsg);
  end;
end.
Код:
program Project1;
uses
  Windows;

begin
  LoadLibrary('Blabla.dll');
end.
Здравствуйте

Последний раз редактировалось NEoMASTERR; 25.03.2015 в 18:33.
NEoMASTERR вне форума Ответить с цитированием
Старый 25.03.2015, 19:02   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

не правильно
CreateWinApiForm должен быть в ThreadFunc... иначе окно не привяжется к потоку

Код:
library Blabla;

uses
  windows,
  Messages;

function ThreadFunc(Param: pointer):dword;stdcall
begin
  CreateWinApiForm;
  while getmessage(mmsg,0,0,0) do
  begin
    translatemessage(mmsg);
    dispatchmessage(mmsg);
  end;
end;

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;

procedure CreateWinApiForm;
begin
  //...
  ShowWindow(Form,SW_MAXIMIZE);
end;

begin
    BeginThread(nil,0,@ThreadFunc,nil,0,thrid);

end.
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 25.03.2015, 19:16   #3
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
не правильно
CreateWinApiForm должен быть в ThreadFunc... иначе окно не привяжется к потоку
Мне не нужно ничего привязывать, мне надо 2 потока, один для обработки сообщений, второй для рисования, суть в том что ThreadFunc вообще не вызывается, стоит бряк на том месте, ставил и messagebox.

Написал маленький графический движок, хочу убрать форму и сделать его самостоятельным.
Сделал таймер но думаю это слишком медленно

Притом BeginThread возвращает не ноль



Код:
library MyGlEngine;

uses
  windows,
  Messages,
  SysUtils,
  Classes;

var
  window:  TWndClassex;
  Form:   hwnd;
  mmsg:  msg;
  FTimerHandle:Cardinal;
  thrid:Cardinal;
  counter:int64;

{$R *.res}

function windowproc(wnd: hwnd; msg: integer; wparam: wparam; lparam: lparam):lresult;stdcall;
var
  dc : HDC;
  ps : PAINTSTRUCT;
begin
  case msg of
  wm_destroy:
    begin
      postquitmessage(0);
      result := 0;
      exit;
    end;
  WM_MOUSEMOVE:
    begin
      //SetWindowText(Form,pchar(inttostr(SMALLINT( lParam and $FFFF))+':'+inttostr(SMALLINT( (lParam shr 16) and $FFFF))+' counter:'+inttostr(counter)));
    end;
 { WM_PAINT:
    begin
      Inc(counter);
      dc := BeginPaint(form, ps);
      //TextOut(dc, 0, 0, PChar('Hello, Windows!'), 15);
      //Rectangle(dc,Random(350),Random(350),Random(350),Random(350));
      EndPaint(form, ps);

      //Result:=0;
    end;   }
  WM_TIMER:
    begin
      Inc(counter);
     // SetWindowText(Form,pchar('counter:'+inttostr(counter)));
    end;
  else
    result := defwindowproc(wnd,msg,wparam,lparam);
  end;
end;

procedure CreateWinApiForm;
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:=1;
  window.lpszmenuname := nil;
  window.lpszclassname := 'main_window';
  registerclassex(window);
  Form:= createwindowex(0,'main_window','Hello World from WinApi', WS_OVERLAPPEDWINDOW,300,300,350,130,0,0,hinstance,nil);
  ShowWindow(Form,SW_MAXIMIZE);

 // FTimerHandle := classes.AllocateHWnd(windowproc);
  //SetTimer(form, 1, 1, nil);
end;

function ThreadFunc(Param: pointer):dword;stdcall
begin
  SetWindowText(Form,'Blabla');
  PostQuitMessage(0);
  exit;
end;

begin

  CreateWinApiForm;
  SetWindowText(Form,pchar(inttostr(BeginThread(nil,0,@ThreadFunc,nil,0,thrid))));
  

  while getmessage(mmsg,0,0,0) do
  begin
    translatemessage(mmsg);
    dispatchmessage(mmsg);
  end;
end.
Здравствуйте

Последний раз редактировалось NEoMASTERR; 25.03.2015 в 19:28.
NEoMASTERR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateThread непонятки с утечкой памяти fucil Общие вопросы Delphi 3 15.01.2013 20:50
boost::thread и CreateThread Sam Gold Общие вопросы C/C++ 3 09.10.2011 18:01
Передача метода класса в CreateThread mike_tihomirov Win Api 3 17.07.2010 14:13
Поставить CreateThread в нужное место Sam Gold C/C++ Сетевое программирование 4 20.05.2010 23:46