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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2012, 23:17   #1
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию GetDC TThread Synchronize - error creating window device context

Создаю поток, через Synchronize получаю дескриптор окна.
Во время работы, при выполнении GetDC - память засоряется и не очищается.
Если потоков много, то при продолжительной работе (в зависимости от количества потоков и скорости цикла) в скором, после сильного засорения - выдает "error creating window device context".

Вот код:
Код:
type
  TZTimer = class(TThread)
  private
    interval:integer;
    Del:Boolean;
    procedure EmuClick;
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  TM:array[1..100]  of TZTimer;
  hWnd:THandle;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
rPos1: TPoint;
begin
GetCursorPos(rPos1);
hWnd:=WindowFromPoint(rPos1);
for i:=1 to 15 do
begin
Tm[i]:=TZTimer.Create(true);
Tm[i].Del:=False;
Tm[i].Interval:=5;
Tm[i].FreeOnTerminate:=true;
Tm[i].Priority:=tpNormal;
Tm[i].Resume;
end;
end;

procedure TZTimer.Execute;
begin
  while Del=False do
  begin
    Sleep(interval);
    Synchronize(EmuClick);
  end;
end;

procedure TZTimer.EmuClick;
var
DC: HDC;
begin
    DC:=GetDC(hWnd);
end;
В чем проблема, что не так делаю?

П.с.
При 15 потоках с интервалом равным 5 мс ошибка выскочит через минут 10 работы.
Раньше не использовал Synchronize, думал, что только в нем дело, но по видимому - ошибся
ZBEP вне форума Ответить с цитированием
Старый 28.08.2012, 23:30   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
After painting with a common DC, the ReleaseDC function must be called to release the DC.
ктото этого не делает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.08.2012, 23:50   #3
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ктото этого не делает.
Точно, все этого не делали! Спасибо!
Все заработало как надо, буду знать теперь
ZBEP вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
надпись Reboot and select proper boot device or insert boot media in selected boot device and press a key что значит Fat0307 Операционные системы общие вопросы 3 11.02.2012 22:48
Reboot and Select proper Boot device or Insert Boot Media in selected Boot device and press a key Walkman97 Операционные системы общие вопросы 4 04.06.2011 22:27
Error Creating cursor handle Dmitry333 Помощь студентам 1 29.03.2010 23:16
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47
error creating cursor handle? Geddar Общие вопросы Delphi 2 31.05.2008 15:19