Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вопрос про поток. [D7, XP]


Страницы:   1 2 3

vegarulez ©   (2008-09-29 10:31:00) 

не могу понять...
при нажатии button1, на котором висит запуск потока - не работает.
выдаёт ошибку при  Connected:=true; к БД...
если же нажать button2, а потом button1 - всё работает... ничего не понимаю...  подскажите где собака порылась?

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, SendMail, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
 Thread_SendMail:Tmsgsend;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Thread_SendMail:=Tmsgsend.Create(False);
Thread_SendMail.priority:=tpNormal;
end;

// далее копия потока, вызываемого по батону1 забиндинная на батон2... для проверки.

procedure TForm1.Button2Click(Sender: TObject);
var
s:string;
i,j:integer;
smsg: array[0..4] of string;
myzconection: TZConnection;
myzquery: TZQuery;
myList:TstringList;
begin
 //FormMain.sendmail:=1;
 myList:=TStringList.Create;
 j:=0;
 myzconection:= TZConnection.Create(nil);
 myzquery:= TZQuery.Create(nil);
 With myzconection do
  try
   Database:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False';
   Protocol:='ado';
   Loginprompt:=false;
   try
    Connected:=true;
     except
     on E: Exception do
      MessageDlg('Error' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
    end;
  With myzquery do
   try
   Connection:=myzconection;
   Sql.Text:='Select `id`,`c_date`,`check_id`,`oper_num`,`c_sum` from `payment` where `sflag`=0  and `flag`=0 ORDER BY id ASC';
   open;
       While not Eof do
        begin
         for j:=0 to FieldCount-1 do
          smsg[j]:=Fields[j].AsString;
          myList.Append(FormatDateTime('DD.MM.YYYY',myzquery.Fields[1].Asdatetime)+#9+FormatDateTime('hh:nn:ss',myzquery.Fields[1].Asdatetime)+#9+myzquery.Fields[2].AsString+#9+myzquery.Fields[3].AsString+#9+StringReplace(myzquery.Fields[4].AsString, ',', '.', [rfReplaceAll])+#13);
          Form1.Memo1.Text:=Mylist.Text;
          Next;
        end;

    except on E: Exception do
    Begin
     MessageDlg('Error #3' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
    End
   end;
  finally
   myList.Free;
   myzconection.Disconnect;
   myzquery.Free;
   myzconection.Free;
  end;
end;

end.


далее код потока

unit SendMail;

interface

uses
 Classes, SysUtils, QDialogs, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection;

type
 Tmsgsend = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;

implementation
uses  unit1;

procedure Tmsgsend.Execute;
var
s:string;
i,j:integer;
smsg: array[0..4] of string;
myzconection: TZConnection;
myzquery: TZQuery;
myList:TstringList;
begin

 //FormMain.sendmail:=1;
try
 myList:=TStringList.Create;
 j:=0;
 myzconection:= TZConnection.Create(nil);
 myzquery:= TZQuery.Create(nil);
 With myzconection do
  try
   Database:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False';
   Protocol:='ado';
   Loginprompt:=false;
   Connected:=true;
   except on E: Exception do
      MessageDlg('Error' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
   end;
  With myzquery do
   try
   Connection:=myzconection;
   Sql.Text:='Select `id`,`c_date`,`check_id`,`oper_num`,`c_sum` from `payment` where `sflag`=0  and `flag`=0 ORDER BY id ASC';
   open;
       While not Eof do
        begin
         for j:=0 to FieldCount-1 do
          smsg[j]:=Fields[j].AsString;
          myList.Append(FormatDateTime('DD.MM.YYYY',myzquery.Fields[1].Asdatetime)+#9+FormatDateTime('hh:nn:ss',myzquery.Fields[1].Asdatetime)+#9+myzquery.Fields[2].AsString+#9+myzquery.Fields[3].AsString+#9+StringReplace(myzquery.Fields[4].AsString, ',', '.', [rfReplaceAll])+#13);
          Form1.Memo1.Text:=Mylist.Text;
          Next;
        end;

    except on E: Exception do
    Begin
     MessageDlg('Error #3' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
    End
   end;
  finally
   myList.Free;
   myzconection.Disconnect;
   myzquery.Free;
   myzconection.Free;
  end;
end;

end.


sniknik   (2008-09-29 14:08:00) [1]

> в основном потоке он(компонент) же нормально создал конектион и всё сделал. а как только вышел за пределы основного - уже ничего сделать не смог...

sniknik ©   (29.09.08 11:41) [21]
> Да неиспользую я ADO... Zeos юзаю!!!
> народ повнимательнее плз....
зато зеос его использует, а ado нужен coinitialize() на каждый поток.


Anatoly Podgoretsky   (2008-09-29 14:06:00) [2]

> Сергей М.  (29.09.2008 13:44:51)  [51]

Нормальный продукт уменьшает количество ошибок кодом except end;


Сергей М.   (2008-09-29 13:48:00) [3]


> просто видишь странно


Не столько странно, сколько страшно, если делать ставку на этот компонент в большом и серьезном проекте.
Если он такие фортели выкидывает уже при коннекте, то чего ожидать от него при дальнейшей работе ?

Короче - "фтопку", без вариантов)


Сергей М.   (2008-09-29 13:44:00) [4]


> Какое?


В дословном переводе с буржуйского текст сообщения об исключении должен был быть следующим "Не был произведен вызов CoInitialize".

В тех же условиях ADO выдаст именно такое исключение. И не только ADO, но и многие другие "приличные" компоненты, использующие OLE/COM-механизмы.


vegarulez   (2008-09-29 13:34:00) [5]

Сергей М. ©   (29.09.08 12:24) [46]

Какое? Что типа не может создать конектинон или то что сам не может подгрузить необходимую модель для конектинона?
просто видишь странно... в основном потоке он(компонент) же нормально создал конектион и всё сделал. а как только вышел за пределы основного - уже ничего сделать не смог...


Сергей М.   (2008-09-29 12:39:00) [6]


> sniknik ©   (29.09.08 12:30) [48]


Охотно верю)


sniknik   (2008-09-29 12:30:00) [7]

> то Zeos можно смело выкинуть в топку
;), не подсматривал....


sniknik   (2008-09-29 12:29:00) [8]

> сделал вот так в потоке:
> CoInitFlags := COINIT_MULTITHREADED;
т.е. все таки все упиралось с инициализацию ком-а (coinitialize и иже с ними...) а зеос вместо нормальной ошибки по этому поводу рушился в AV... забавные компоненты.
в печку их, вместе с Марксом и этим как его там Энгельсом! © профессор Преображенский

задумался бы о смене их на нормальные что ли...


Сергей М.   (2008-09-29 12:24:00) [9]


> всё заработало


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


vegarulez   (2008-09-29 12:23:00) [10]

Так что
Vlad Oshin ©   (29.09.08 12:19) [43]
Спасибо!


sniknik   (2008-09-29 12:21:00) [11]

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

и объяснил зачем
> проверить, нужна инициализация или внутренний обьект

ты хоть читай что тебе пишут то, пытайся понять...


vegarulez   (2008-09-29 12:19:00) [12]


> Vlad Oshin ©   (29.09.08 12:07) [37]


> vegarulez ©   (29.09.08 12:11) [39]
> Vlad Oshin ©   (29.09.08 12:07) [37]не знаю как этим пользоваться.
>


поискал и нашёл про это

Прочёл
http://www.interface.ru/home.asp?artId=3447

сделал вот так в потоке:
uses... ComObj, ActiveX...
...
procedure Tmsgsend.Execute;
var
s:string;
i,j:integer;
smsg: array[0..4] of string;
myzconection: TZConnection;
myzquery: TZQuery;
myList:TstringList;
begin
  CoInitFlags := COINIT_MULTITHREADED;
try
 myList:=TStringList.Create;
 j:=0;
 myzconection:= TZConnection.Create(nil);
 myzquery:= TZQuery.Create(nil);
 With myzconection do
  try
   Database:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False';
   Protocol:='ado';
   Loginprompt:=false;
   Connected:=true;
   except on E: Exception do
      MessageDlg('Error' +#10#13+ E.Message +#10#13+ inttostr(E.HelpContext), mtWarning,[mbOk], 0);
   end;
....


всё заработало.


Vlad Oshin   (2008-09-29 12:19:00) [13]

unit SendMail;

interface

uses
Classes, SysUtils, QDialogs, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection;

type
Tmsgsend = class(TThread)
private
  { Private declarations }
protected
  procedure Execute; override;
end;

implementation
uses  unit1;

procedure Tmsgsend.Execute;
var
s:string;
i,j:integer;
smsg: array[0..4] of string;
myzconection: TZConnection;
myzquery: TZQuery;
myList:TstringList;
begin

//FormMain.sendmail:=1;
try
myList:=TStringList.Create;
j:=0;

CoInitializeEx (NIL, COINIT_APARTMENTTHREADED);//так или константы может другие, из по F1

myzconection:= TZConnection.Create(nil);
myzquery:= TZQuery.Create(nil);
With myzconection do
 try


Сергей М.   (2008-09-29 12:14:00) [14]


> почему в дочернем потоке не может осуществить конект


Кто сказал что "не может", кроме тебя ?
Никто и не сказал, это лишь плод твоего нездорового воображения)

До коннекта и дело-то не доходит - AV возникает еше доконнекта !


vegarulez   (2008-09-29 12:11:00) [15]

Vlad Oshin ©   (29.09.08 12:07) [37]
не знаю как этим пользоваться.


Сергей М.   (2008-09-29 12:11:00) [16]


> при чём тут мемо и т.п.


мемо тут действительно ни причем, а вот "и т.п." оч даже причем.

Ну не желаешь отвечать - парься тогда сам)


vegarulez   (2008-09-29 12:09:00) [17]

почему в дочернем потоке не может осуществить конект пока в главном потоке не произведёшь конект?....  кто нить может кратко ответить, не говоря мне про мемо vcl и прочее? если по существу какую инфу надо - отвечу на вопросы. Но вроде уже и так всё расписал дословно каждое действие. и какие ошибки и как отладчик их отловил - и что выдал...


Vlad Oshin   (2008-09-29 12:07:00) [18]


> CoInitializeEx пробовали? Не получилось?


vegarulez   (2008-09-29 12:06:00) [19]

brother ©   (29.09.08 12:04) [34]
ну реально не смешно. не в тему.


vegarulez   (2008-09-29 12:06:00) [20]

brother ©   (29.09.08 12:04) [34]
ну реально не смешно. не в тему.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо