Работа с потоками в delphi - Страница 4 - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming

Программирование / Programming
Ищете помощи в написании программы, есть сложность в выполнении задания (в институте и т.д.), пожалуйста, спросите у нас в данном форуме и мы обязательно вам поможем.

Ответ
Опции темы
Непрочитано 14.09.2012, 03:58   #31
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: Работа с потоками в delphi

Цитата:
Сообщение от Hint Посмотреть сообщение
Из потоков нельзя просто так вызывать функции VCL. И нельзя просто так обращаться ко внешним данным (или вызывать функции, которые используют внешние данные). Все должно быть синхронизировано: или с использованием блокировок, или с посылкой сообщений в основной поток (который в свою очередь уже будет работать с общими данными).
А можно пример? Как я понял, имеется ввиду CriticalSection, нет?
Zubastic вне форума Ответить с цитированием
Непрочитано 14.09.2012, 09:19   #32
Аватар для Hint
Герой

По умолчанию Re: Работа с потоками в delphi

Цитата:
Сообщение от Zubastic Посмотреть сообщение
А можно пример? Как я понял, имеется ввиду CriticalSection, нет?
Да, это и есть блокировки (enter / leave или lock / unlock).

Пример (что первым попалось в коде). Есть поток, отвечающий за связь с веб-сервером (класс TWebClient). Если рабочий поток, собирающий данные. Рабочий поток для отправки данных вызывает метод AddUserData.

Код:
procedure TWebClient.AddUserData(Line: string);
begin
  UserData.Lock;
  try
    UserData.Add(line);
  finally
    UserData.Unlock;
  end;
end;
UserData - private свойство класса TWebClient.

Поток TWebClient с определенным интервалом соединяется с сервером и вызывает свой метод SendUserData:
Код:
function TWebClient.SendUserData: Integer;
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.Clear;
    UserData.Lock; // Блокируем объект
    try
      SL.AddStrings(UserData); // Копируем содержимое в локальный объект
      UserData.Clear;
    finally
      UserData.Unlock; // Снимаем блокировку
    end;    
    
    if SL.Count > 0 then
      begin
        Result := UploadData(SL);
        if Result = -1 then
          begin
            UserData.Lock;
            try
              UserData.AddStrings(SL);
            finally
              UserData.Unlock;
            end;            
          end;
      end
    else Result := 0;
  finally
    FreeAndNil(SL);
  end;
end;
Общие данные - объект UserData (свой класс TSafeStringList). При работе с ним используются критические секции (сначала Lock, потом Unlock).

Код:
  TSafeStringList = class(TStringList)
  private
    CriticalSection: TCriticalSection;
  public
    procedure Lock;
    procedure Unlock;
    constructor Create;
    destructor Destroy; override;
  end;
...
constructor TSafeStringList.Create;
begin
  inherited Create;
  CriticalSection := TCriticalSection.Create;
end;

destructor TSafeStringList.Destroy;
begin
  CriticalSection.Free;
  inherited Destroy;
end;

procedure TSafeStringList.Lock;
begin
  CriticalSection.Enter;
end;

procedure TSafeStringList.Unlock;
begin
  CriticalSection.Leave;
end;
__________________
hLaPEx, Evermore, hAuthD, L2on, ...
Hint вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 16.09.2012, 15:10   #33
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: Работа с потоками в delphi

Вопрос немного не по теме:
В программе есть встроенный апдейтер, в итоге касперский определяет программу как самообновляющееся троянское ПО. Впринципе решение - криптовать исполняемый файл, но есть ли что-то более удобное?

Добавлено через 1 час 8 минут
 if ver<Memo3.Lines[0] then
 begin
  Stream:=TMemoryStream.Create;
  Stream.LoadFromFile(paths+'Updater.exe');
  Stream2:=TMemoryStream.Create;
  try
   idHTTP1.Get(url, Stream2); //Загрузка в поток данных из сети
   if Stream.Size <> Stream2.Size then
   begin
    DeleteFile(paths+'Updater.exe');
    Stream2.SaveToFile(paths+'Updater.exe');
   end;
   ShellExecute(Form1.Handle,'open', pchar(paths+'Updater.exe'), nil, nil, SW_SHOWNORMAL);
   Application.Terminate;
  except
   on E:Exception do
   begin
    if FileExists(paths+'error.log') then Memo3.Lines.LoadFromFile(paths+'error.log');
    if idHTTP1.ResponseCode = -1 then Memo3.Lines.Add(DateTimeToStr(Now)+' - Не удается скачать апдейтер. (-1)')
    else if idHTTP1.ResponseCode = 404 then Memo3.Lines.Add(DateTimeToStr(Now)+' - Апдейтер не найден. (404)')
    else Memo3.Lines.Add(DateTimeToStr(Now)+' - Error: '+E.ClassName+'. Msg: '+E.Message);
    Memo3.Lines.SaveToFile(paths+'error.log');
   end;
  end;
  Stream.Free;
  Stream2.Free;
 end;
Code: Pascal
Ругается конкретно на строчку с ShellExecute.

Последний раз редактировалось Zubastic; 16.09.2012 в 16:19. Причина: Добавлено сообщение
Zubastic вне форума Ответить с цитированием
Непрочитано 17.09.2012, 01:09   #34
Забанен за кидаловo/обман/развод

По умолчанию Re: Работа с потоками в delphi

Дабы не гадить новой темой в разделе - подскажите по плюсовым (С++) потокам:
1) Возможно ли ограничивать как то созданный поток ресурсами ПК (Ибо в некоторых случаях грузит проц в 100% (если использовать цикл в новом потоке)
2) Возможно ли стартовать новый поток по таймеру, но при этом не глушить BaseThread?(Тупанул со Sleep)
3) Мельком натыкался на инфу, что не стоит юзать CreateThread обычного WinAPI...Что с ним не так? К чему приводит?
4) для чего многие описывают CloseHandle(Thread)? Поток же и так закроется при выполнении нужной задачи О_о (Или тут я чего-то не понял?)
---
P.S - начал чуток познавать плюсы, но нет жесткой возможности много читать Работа...
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Непрочитано 17.09.2012, 01:31   #35
Олдфаг

По умолчанию Re: Работа с потоками в delphi

Цитата:
Сообщение от KilRoy Посмотреть сообщение
1) Возможно ли ограничивать как то созданный поток ресурсами ПК (Ибо в некоторых случаях грузит проц в 100% (если использовать цикл в новом потоке)
Юзать приоритеты и Sleep/WaitFor... если нет полезной нагрузки.

Цитата:
Сообщение от KilRoy Посмотреть сообщение
3) Мельком натыкался на инфу, что не стоит юзать CreateThread обычного WinAPI...Что с ним не так? К чему приводит?
К ошибкам выделения памяти, инфы тонна, в Delphi к слову также, надо юзать beginthread.

Цитата:
Сообщение от KilRoy Посмотреть сообщение
4) для чего многие описывают CloseHandle(Thread)? Поток же и так закроется при выполнении нужной задачи О_о (Или тут я чего-то не понял?).
Незакрытый хендл порождает утечку объекта: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Цитата:
The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle.
G1ta0 вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 17.09.2012, 02:55   #36
Аватар для Zubastic
ZG troll squad

Автор темы (Топик Стартер) Re: Работа с потоками в delphi

G1ta0, вообще как сделать самообновление без детектирования антивирем?
Zubastic вне форума Ответить с цитированием
Непрочитано 17.09.2012, 04:10   #37
Олдфаг

По умолчанию Re: Работа с потоками в delphi

Да они в любом случаем ругаются на апдейтеры самописные. Попробуй CreateProcess вместо ShellExecute.
G1ta0 вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 17.09.2012, 19:21   #38
Забанен за кидаловo/обман/развод

По умолчанию Re: Работа с потоками в delphi

Цитата:
Сообщение от G1ta0 Посмотреть сообщение
К ошибкам выделения памяти, инфы тонна, в Delphi к слову также, надо юзать beginthread.
Кстати пересев на _beginthread заметил кое какие улучшения в быстродействии вроде как Правда размер компиленной программки вырос чуток Ну то мелочи
СПС за инфу!!!

Цитата:
Сообщение от G1ta0 Посмотреть сообщение
Юзать приоритеты и Sleep/WaitFor... если нет полезной нагрузки.
Каждая миллисекунда на весу Но всё же слип пришлось использовать, ибо это был хаос...Но меня не это интересовало
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Непрочитано 17.09.2012, 19:33   #39
Олдфаг

По умолчанию Re: Работа с потоками в delphi

Цитата:
Сообщение от KilRoy Посмотреть сообщение
Каждая миллисекунда на весу Но всё же слип пришлось использовать, ибо это был хаос...Но меня не это интересовало
Чтобы поток не отжирал весь проц, можно передавать периодически управление на другой поток (yield). Если действительно задача не может обойтись Sleep.

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
G1ta0 вне форума Ответить с цитированием
Сказали спасибо:
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сборка Lineage II на Delphi GoodShadow Курилка / Yak floor 12 17.01.2012 21:57
Частичная работа для php программера (работа с веб) niko42 Рынок / Marketplace 13 22.03.2011 13:30
Delphi weTr1k Программирование / Programming 0 13.03.2011 05:18


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 09:00. Часовой пояс GMT +3.

Вверх