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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2010, 03:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос [Вопрос] Реализация многопоточности запуска/остановки конкретных программ из списка

Доброго времени суток!

И так хочу реализовать многопоточность в своей программе.
т.е контроль многопоточности.

Моя программа запускает другие программы при помощи класса TThread и каждый запущенный поток ожидает завершения запускаемой им программы.

но проблема состоит в том что нет возможности запустить/остановить какую-то конкретно выбранную программу в списке.

Есть только запуск всего и остановки вся .

Хотелось бы узнать о том как реализовать запуск/остановку выбранной программы в списке или скажем потока в списке.


Что для этого нужно?
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2010, 09:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

при создании потока для элемента из списка надо зафиксировать данный объект (поток) за элементом списка (для этого обычно применяют свойства списка (элемента спска) для хранения данных пользователя (программиста). В зависмости от используемого класса списка. Tag | Data | Objects[]

Код:
var
  r: TMyThread;
  item: TTreeNode;
//фиксирование
item:=TTreeView.Selected;
r=TMyTheead.Create;
item.Data:=r;

// доступ для использования
item:=TTreeView.Selected;
r:=TMythhread(item.Data);
r.... // что нам делать с данным потоком
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.10.2010 в 10:02.
evg_m вне форума Ответить с цитированием
Старый 04.10.2010, 11:19   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Хм у меня вот так выглядит код:

Код:
unit AppsListUnit;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Dialogs, ExtCtrls, IniFiles, ComCtrls, AppThreadUnit,
  TlHelp32, ProccesUnit;

type
  {Класс программы (Запуск остановка, и всё что с этим связано)}
  TApp = class
  private
    Timer: TTimer;
    procedure KillChidProcces;
    procedure DoTimer(Sender: TObject);
  public
    AppInfo: TAppInfo;
    AppThr: TappThread;    //поток который запускает программы
    constructor Create;
    destructor Destroy; override;
    procedure Start;
    procedure Stop;
  end;

  {Класс списка программ, сохранение, загрузка=)}
  TAppsList = class(TList)
  private
    function GetApp(Indx: integer): TApp;
  public
    destructor Destroy; override;
    property Apps[Indx: Integer]: TApp read GetApp;
    procedure AddApp(app: TApp);
    procedure DeleteApp(Indx: Integer);
    procedure Load;
    procedure Save;
    procedure Start;
    procedure Stop;
  end;

implementation

uses MainUnit, GlobalConsts, GlobalStrings;

var
  i: Integer;

  { TApp }

constructor TApp.Create;
begin
  Timer := TTimer.Create(nil);
  Timer.Enabled := False;
  Timer.OnTimer := DoTimer;
end;

destructor TApp.Destroy;
begin
  Timer.Free;
  inherited;
end;

procedure TApp.DoTimer(Sender: TObject);
begin
  KillChidProcces;
  TerminateProcess(AppThr.PI.hProcess, 0);
end;

procedure TApp.KillChidProcces;
var
  pl: Cardinal;
  pe: TProcessEntry32;
  hp: HWND;
begin
  pl := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  if pl = INVALID_HANDLE_VALUE then
    Exit;
  try
    pe.dwSize := SizeOf(pe);
    if Process32First(pl, pe) then
      repeat
        if pe.th32ParentProcessID = AppThr.PI.dwProcessId then
        begin
          hp := OpenProcess(PROCESS_ALL_ACCESS, False, pe.th32ProcessID);
          TerminateProcess(hp, 0);
          CloseHandle(hp);
          Break;
        end;
      until not Process32Next(pl, pe);
  finally
    CloseHandle(pl);
  end;
end;

procedure TApp.Start;
begin
  if AppThr = nil then
  begin
    AppThr := TAppThread.Create(true);
    AppThr.AppInfo := @AppInfo;
    AppThr.Resume;
    Timer.Interval := AppInfo.AppRestart * 1000 * 60;
    Timer.Enabled := True;
  end;
end;

procedure TApp.Stop;
begin
  if AppThr <> nil then
  begin
    Timer.Enabled := False;
    AppThr.Terminate;
    KillChidProcces;
    TerminateProcess(AppThr.PI.hProcess, 0);
    AppThr.Free;
    AppThr := nil;
  end;
end;

{ TAppsList }

procedure TAppsList.AddApp(App: TApp);
var
  LI: TListItem;
begin
  with MainForm.Appslist do
  begin
    add(App);
    Li := Items.Add;
    if App.AppInfo.AppName = '' then
    begin
      app.AppInfo.AppName := RsApplicationNoTittle;
    end;
    LI.Caption := app.AppInfo.AppName;
  end;
end;

procedure TAppsList.DeleteApp(Indx: Integer);
begin
  Apps[indx].Free;
  Delete(indx);
end;

destructor TAppsList.Destroy;
begin
  while Count > 0 do
  begin
    TApp(Items[0]).Free;
    Delete(0);
  end;
  inherited;
end;

function TAppsList.GetApp(Indx: integer): TApp;
begin
  Result := Items[Indx];
end;

procedure TAppsList.Start;
var
  i:Integer;
begin
  for i := 0 to Count - 1 do
    if Apps[i].AppInfo.AppStart then
      Apps[i].Start;
end;

procedure TAppsList.Stop;
var
  i:Integer;
begin
  for i := 0 to Count - 1 do
    Apps[i].Stop;
end;

end.
Для запуска и остановки всех программ в списке используются процедуры:
Код:
procedure TAppsList.Start;
procedure TAppsList.Stop;
в свою очередь которые используют вот эти две из класса TApp:
Код:
procedure TApp.Start;
procedure TApp.Stop;
переменная класса TApp , Apps по сути счётчик потоков.

как тут реализовать запуск/остановку выбранного потока?
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2010, 13:44   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Для запуска и остановки всех программ в списке используются процедуры:
Код:
procedure TAppsList.Start;
procedure TAppsList.Stop;
в свою очередь которые используют вот эти две из класса TApp:
Код:
procedure TApp.Start;
procedure TApp.Stop;
переменная класса TApp , Apps по сути счётчик потоков.

как тут реализовать запуск/остановку выбранного потока?
Цитата:
Код:
procedure TAppsList.Stop;
var
  i:Integer;
begin
  for i := 0 to Count - 1 do
    Apps[i].Stop;
end;
Код:
procedure Tapplist.StartOne(indexapp: integer);
begin
  iapps[indexapp].Start;
end;

procedure Tapplist.StopOne(indexapp: integer);
begin
  iapps[indexapp].Stop;
end;
так?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.10.2010 в 13:51.
evg_m вне форума Ответить с цитированием
Старый 04.10.2010, 14:12   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

нет, не работает =(((
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2010, 19:44   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
нет, не работает =(((
как жто было обнаружено?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.10.2010, 20:22   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

программа из списка просто не запустилась.
Код:
procedure TMainForm.AppsRunBtnClick(Sender: TObject);
var
  i: Integer;
begin
    i := Appslist.ItemIndex;
  if i <> -1 then
  begin
  AppList.StartOne(i);
  end;
end;
Код:
procedure TAppsList.StartOne(indx: integer);
begin
Apps[indx].Start;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 05.10.2010, 15:38   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

поможет кто? пожалуйста
Человек_Борща вне форума Ответить с цитированием
Старый 06.10.2010, 08:59   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
procedure TApp.Start;
begin
  if AppThr = nil then  ///  может вот это
  begin
    AppThr := TAppThread.Create(true);
    AppThr.AppInfo := @AppInfo;
    AppThr.Resume;
    Timer.Interval := AppInfo.AppRestart * 1000 * 60;
    Timer.Enabled := True;
  end;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная реализация однонаправленного линейного списка Денис Ст Помощь студентам 2 14.01.2014 21:50
реализация выбора из списка yulkas Microsoft Office Access 5 25.03.2010 14:07
Сетевое приложение для удаленного запуска программ. Ветас Работа с сетью в Delphi 2 11.11.2007 09:19