![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#46
|
|||
|
|||
|
Цитата:
ну у меня пока из dll и запускается форма в отдельном потоке софт MetaTrader4 со своим языком MQL4, в нем можно сделать скрипт, прикрутить dll к коду. вот только работает он хитро немного, надо обязательно чтобы форма в отдельном потоке была |
|
#47
|
|||
|
|||
|
Цитата:
не боишся разориться со своими познаниями в дельфи ? |
|
#48
|
|||
|
|||
|
Цитата:
"автопродавалки" пишутся на mql4, dll им не нужны |
|
#49
|
|||
|
|||
|
а ктонибудь знает как правильно уничтожать форму откртую в 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
|
|||
|
|||
|
Может кто поможет разобраться, как правильно сделать
могу весь проект выложить если надо вобщем в длл в отдельном потоке создаю форму, сразу же открываю 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
|
|||
|
|||
|
хм, поменял местами вызовыи заработало все.
сделал сначала открытие файла, так: Form1.OpenSendMMF; Form1.ShowModal; только не понял в чем прикол |
|
#52
|
||||
|
||||
|
ShowModal ждет пока форма не закроется, следовательно код после ShowModal продолжи выполнение, когда форма захлопнется.
|