Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #46  
Старый 23.01.2013, 13:38
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

Цитата:
Сообщение от my33oh
плагин чтоле?
нахрена тогда еще одна внешняя прога, все в длл и делается
где ты видел плагины чтобы еще какуюто внешнюю хрень приходилось запускать?
что за другая программа (кстати с этого и надо было начинать) ?

ну у меня пока из dll и запускается форма в отдельном потоке
софт MetaTrader4 со своим языком MQL4, в нем можно сделать скрипт, прикрутить dll к коду. вот только работает он хитро немного, надо обязательно чтобы форма в отдельном потоке была
Ответить с цитированием
  #47  
Старый 23.01.2013, 15:21
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

Цитата:
Сообщение от harbor
софт MetaTrader4 со своим языком MQL4
автопродавалку\покупалку пишешь?
не боишся разориться со своими познаниями в дельфи ?
Ответить с цитированием
  #48  
Старый 23.01.2013, 18:16
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

Цитата:
Сообщение от my33oh
автопродавалку\покупалку пишешь?
не боишся разориться со своими познаниями в дельфи ?

"автопродавалки" пишутся на mql4, dll им не нужны
Ответить с цитированием
  #49  
Старый 24.01.2013, 20:07
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

а ктонибудь знает как правильно уничтожать форму откртую в dll в отдельном потоке?
то есть открываю ее так
Код:
procedure Start1; // вызываю из основной программы
begin
 T1:=TMyThread.Create(false);
end;

 procedure TMyThread.Execute;
 begin
 FormShow;
 end;


procedure TMyThread.FormShow;
begin

 Form1:=TForm1.Create(nil);
 Form1.ShowModal;
 end;

а закрывать вот так надо?
Код:
procedure TMyThread.FreeForm;
begin
 Form1.Free;
 //Form1.Close;
end;

и надо ли мне уничтожать поток при закрытии
типа
Код:
T1.Terminate;

а то вроде все работает, но иногда сыпит ошибки, причем сам борланд
Ответить с цитированием
  #50  
Старый 03.02.2013, 16:34
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

Может кто поможет разобраться, как правильно сделать
могу весь проект выложить если надо

вобщем в длл в отдельном потоке создаю форму, сразу же открываю memory map file, и по нажатию кнопки на форме, в файл должны записаться две переменные, но валится ошибка Access violation в моей длл write of adress 00000000
то есть ошибка уже при попытке записи

наверное я как-то не так пишу, а что не так не знаю,
видимо дело в обьявлении классов, я там как-то все почти наугад сделал

из основной программы вызывается процедура Start1

код не сильно сложный, но у меня пока мало опыта и не пойму как все правильно связать, чтобы работало без ошибок..

Код:
unit DLL;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons,  ExtCtrls;


const
  MMFID = '{D9CFD3BD-3E91-4748-B9F9-7A1825847DF7}';


  type

  TMyThread = class(TThread)


   private
     { Private declarations }

   protected

     procedure FormShow;
     procedure FreeForm;
     procedure Execute; override;


  end;

  PTestStructure = ^TTestStructure;
  TTestStructure = packed record
    A: Integer;
    B: double;
   end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    RadioGroup1: TRadioGroup;
    ComboBox1: TComboBox;



    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations } 
     CallForm: THandle;

    function OpenSendMMF: Boolean;  
    function AddText: Boolean;
    function CloseSend: Boolean;
    function OpenRecMMF: Boolean;
    function ReadText: Boolean;
    function CloseRec: Boolean;


  public
  { Public declarations }
  end;


  procedure FreeForm;
  procedure Start1;


var
  Form1: TForm1;
  T1: TMyThread;
  y:Pchar;

  SendMMF, RecMMF: THandle;
  SendData, RecData: PChar;

  oper:  integer; // переменная для записи 1
  lot: double;    // переменная для записи 2
  count:integer;


implementation

{$R *.dfm}


procedure Start1;
begin
 T1:=TMyThread.Create(false);
end;


procedure FreeForm;
begin
 Form1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
oper:=1;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
oper:=2;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
oper:=3;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
oper:=4;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 SendMessage(CallForm, wm_User, 0, 0);
 Form1.Free;
 T1.Terminate;
 //TForm1.CloseRec;
end;


 procedure TMyThread.Execute;
 begin
 FormShow;
 end;


procedure TMyThread.FormShow; // выполнение  в потоке
begin

 Form1:=TForm1.Create(nil);
 Form1.ShowModal;
 Form1.OpenSendMMF;


 end;


procedure TMyThread.FreeForm;
begin
 Form1.Free;

end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
DecimalSeparator := '.';
lot:= StrToFloat(RadioGroup1.Items[RadioGroup1.ItemIndex]);


end;
//  ComboBox.Items.Add(edit.text)


//  Создаем Memory Mapped File ...
// =============================================================================
function TForm1.OpenSendMMF: Boolean;
begin
  SendMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4096,
    PChar(MMFID));
  Result := SendMMF <> 0;
end;


//  Добавляем в файл текст ...
// =============================================================================
function TForm1.AddText: Boolean;
var
  F: TTestStructure;
  Z: PTestStructure;
begin

  F.A := oper;
  F.B := count;
  Z := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0);
  Result := Z <> nil;
  Z^ := F;
end;


//  Разрушаем Memory Mapped File ...
// =============================================================================
function TForm1.CloseSend: Boolean;
begin

  UnmapViewOfFile(SendData);
  SendData := nil;
  CloseHandle(SendMMF);
  Result := True;
end;


//  Открываем созданный ранее Memory Mapped File ...
// =============================================================================
function TForm1.OpenRecMMF: Boolean;
begin
  RecMMF := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MMFID));
  Result := RecMMF <> 0;
end;


//  Читаем из него данные ...
// =============================================================================
function TForm1.ReadText: Boolean;
var
  F: TTestStructure;
  Z: PTestStructure;
begin

  Z := MapViewOfFile(SendMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  F := Z^;
  Result := Z <> nil;


end;


//  Закрываем (не разрушаем) Memory Mapped File ...
// =============================================================================
function TForm1.CloseRec: Boolean;
begin                      
  UnmapViewOfFile(RecData);
  RecData := nil;
  CloseHandle(RecMMF);
  Result := True;
end;



end.

Последний раз редактировалось harbor, 03.02.2013 в 16:41.
Ответить с цитированием
  #51  
Старый 03.02.2013, 17:05
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

хм, поменял местами вызовыи заработало все.
сделал сначала открытие файла, так:

Form1.OpenSendMMF;
Form1.ShowModal;


только не понял в чем прикол
Ответить с цитированием
  #52  
Старый 03.02.2013, 17:09
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

ShowModal ждет пока форма не закроется, следовательно код после ShowModal продолжи выполнение, когда форма захлопнется.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter