Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema com thread (Exeption EOSError in module NomeDoPro


LucAlucard

Pergunta

Bom dia pessoal tudo bem com vocês?

Gente, estou apredendo agora sobre Thread com Delphi e fui fazer um sisteminha que sempre quis usando esse tipo de processo. Que seria uma alerta estilo MSN (aquelas no canto inferior da tela). Porém quando eu fecho o meu sistema de teste ele da a seguinte mensagem de erro:

OQAAAJ8g8r5KEvx-Yh_0ufz97g6nMGwxvjzNU1ys

alguém já teve esse problema ou sabe o porque dele? qualquer coisa disponibilizo o código fonte da minha aplicação... vlw gnt

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

baixei seu código, mas não consegui rodar devido a algumas units que não tenho e voce não colocou junto com o código.

entretanto fazendo uma breve analise, tudo indica que ao fechar o seu form, a Thread ainda esta sendo executada, ocorrrendo o erro de mémoria.

coloque um break point no código:

sMSN := TShowMsn.Create(True);

e siga com o debuger do delphi para ver onde esta ocorrendo o problema ( utilize a tecla F7 e não a F8 )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

experimente:

procedure TFrmTelaIni.Button1Click(Sender: TObject);

  function TerminateThread(hThread: THandle; dwExitCode: DWORD);

var
  sMSN : TShowMSN;
begin

  sMSN := TShowMsn.Create(True);
  sMSN.FreeOnTerminate := True;
  Priority := TpLower;

  if Terminated then
     TerminateThread(sMSN.Handle, 0);

  sMSN.Suspend;
  sMSN.Resume;

end;

eu tava lendo algo assim mesmo.. mas não encontrei como encerrar a Thread..

veja:

http://users.skynet.be/bk296578/Dro/Delphi...tm#_Toc24549110

http://books.google.com.br/books?id=9JzBn4...phi&f=false

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

meu mudei o código mas por enquanto ta assim:

Form Inicial

unit FrmInicial;

interface

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

type
  TFrmTelaIni = class(TForm)
    edtImgs: TEdit;
    SpeedButton1: TSpeedButton;
    cbBox: TCheckBox;
    EdtBtns: TEdit;
    Button1: TButton;
    edtTpTrans: TEdit;
    procedure edtImgsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure SpeedButton1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  FrmTelaIni: TFrmTelaIni;

implementation

uses FrmMensagem_, AlertaDoMSN_, FrmAlertaDoMSN_;

{$R *.dfm}


procedure TFrmTelaIni.Button1Click(Sender: TObject);
begin
  prExibeMensMsn(StrToInt(edtImgs.Text),StrToInt(edtTpTrans.Text));
end;

procedure TFrmTelaIni.edtImgsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key = VK_RETURN then
  begin
  SpeedButton1.Click;
  edtImgs.SelectAll;
  end;
end;

procedure TFrmTelaIni.SpeedButton1Click(Sender: TObject);
begin
if cbBox.Checked then
  NewShowMessage('Teste', 'Mensagem <b>DE TESTE</b> para saber se isso vai funcionar direitinho', StrToInt(edtImgs.Text))
else
  showmessage(IntToStr(NewMessageBox('Teste', 'Mensagem <b>DE TESTE</b> para saber se isso vai funcionar direitinho', StrToInt(edtImgs.Text), StrToInt(EdtBtns.Text))));
end;

end.
Form Alerta MSN
unit FrmAlertaDoMSN_;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ThreadExibeMensMSN,
  Dialogs, ExtCtrls, StdCtrls, HTMLabel, ImgList, LMDPNGImageList, TeeProcs, TeeDraw3D, frmshape;

type
  TFrmAlertaDoMSN = class(TForm)
    Panel1: TPanel;
    imgShow: TImage;
    imgsIco: TLMDPNGImageList;
    pnlMsgm: TDraw3D;
    lblMens: THTMLabel;
    Panel2: TPanel;
    Formshape1: TFormshape;
    T1: TTimer;
    TContad: TTimer;
    procedure T1Timer(Sender: TObject);
    procedure TContadTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    vAlertaMSN: TMsgMSN;
    procedure prExibeMensMsnInterno(Icone, Transacao: Integer);
  public
    vCont : Integer;
    { Public declarations }
  end;

procedure prExibeMensMsn(Icone, Transacao: Integer);

var
  FrmAlertaDoMSN: TFrmAlertaDoMSN;

implementation

{$R *.dfm}

procedure prExibeMensMsn(Icone, Transacao: Integer);
begin
FrmAlertaDoMSN := TFrmAlertaDoMSN.Create(Application);
FrmAlertaDoMSN.prExibeMensMsnInterno(Icone, Transacao);
end;

{ TFrmAlertaDoMSN }

procedure TFrmAlertaDoMSN.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not (T1.Enabled) then
  begin
  FreeAndNil(FrmAlertaDoMSN);
  end;
Abort;
end;

procedure TFrmAlertaDoMSN.FormCreate(Sender: TObject);
begin
vCont := 0;
end;

procedure TFrmAlertaDoMSN.prExibeMensMsnInterno(Icone, Transacao: Integer);
begin
vAlertaMSN := TMsgMSN.Create(False, Self, Icone, Transacao);
T1.Enabled := True;
end;

procedure TFrmAlertaDoMSN.T1Timer(Sender: TObject);
begin
if vAlertaMSN.vFim then
  T1.Enabled := False;
if not(T1.Enabled) then
  begin
  T1.Enabled := False;
  end;
end;

procedure TFrmAlertaDoMSN.TContadTimer(Sender: TObject);
begin
vCont := vCont + 1;
if vCont >= 4 then
  begin
  TContad.Enabled := False;
  vCont := 0;
  end;
end;

end.
A thread
unit ThreadExibeMensMSN;

interface

uses
  Classes, Forms, Windows, ExtCtrls, dialogs;

type
  TMsgMSN = class(TThread)
  public
    vFim: Boolean;
    constructor Create(CreateSuspended: Boolean; Frm: TForm; Icone, Transacao: Integer);
  private
    vfrm: TForm;
    vIco, vTrans : Integer;
  protected
    procedure Execute; override;
  end;

implementation

uses FrmAlertaDoMSN_;

{
  Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

  Synchronize(UpdateCaption);

  and UpdateCaption could look like,

  procedure TMsgMSN.UpdateCaption;
  begin
  Form1.Caption := 'Updated in a thread';
  end;

  or

  Synchronize(
  procedure
  begin
  Form1.Caption := 'Updated in thread via an anonymous method'
  end
  )
  );

  where an anonymous method is passed.

  Similarly, the developer can call the Queue method with similar parameters as
  above, instead passing another TThread class as the first parameter, putting
  the calling thread in a queue with the other thread.

}

{ TMsgMSN }

constructor TMsgMSN.Create(CreateSuspended: Boolean; Frm: TForm; Icone, Transacao: Integer);
begin
inherited Create(CreateSuspended);
vfrm            := Frm;
FreeOnTerminate := True;
vIco            := Icone;
vTrans          := Transacao;
end;

procedure TMsgMSN.Execute;
var
  lFrm : TFrmAlertaDoMSN;
  I: Integer;
  BarraIniciar: HWND; { Barra Iniciar }
  tmAltura: Integer;
  tmRect: TRect;
  xTop: Integer;
  xIniTop: Integer;

begin
while (not Terminated) and (vFim = false) do
  begin
  lFrm := vFrm as TFrmAlertaDoMSN;
  //Priority := tpLower;

  BarraIniciar := FindWindow('Shell_TrayWnd', nil); // localiza o Handle da janela iniciar
  GetWindowRect(BarraIniciar, tmRect); // Pega o "retângulo" que envolve a barra e sua altura
  tmAltura := tmRect.Bottom - tmRect.Top;
  with lFrm do
    begin
    case vIco of
      1: imgShow.picture.Assign(imgsIco.PNGByName['Questao.png']);
      2: imgShow.picture.Assign(imgsIco.PNGByName['Questao2.png']);

      3: imgShow.picture.Assign(imgsIco.PNGByName['Exclamacao.png']);
      4: imgShow.picture.Assign(imgsIco.PNGByName['Exclamacao2.png']);

      5: imgShow.picture.Assign(imgsIco.PNGByName['Cancelar.png']);

      6: imgShow.picture.Assign(imgsIco.PNGByName['Erro.png']);
    end;
    Left := Screen.Width - ClientWidth;
    if tmRect.Top = -2 then
      tmAltura := 30; // Pega o top final
    xTop := Screen.Height - ClientHeight - tmAltura; // Pega o top inicial
    xIniTop := Screen.Height + ClientHeight + tmAltura;
    Top := xIniTop;

    case vTrans of
      0:
        begin
        // Subindo
        for I := xIniTop downto xTop do
          begin
          Top := Top - 1;
          Show;
          Update;
          Application.ProcessMessages;
          end;
        // Espera
        TContad.Enabled := True;
        while vCont < 3 do Application.ProcessMessages;
        // Descendo
        for I := xIniTop downto xTop do
          begin
          Top := Top + 1;
          Show;
          Update;
          Application.ProcessMessages;
          Sleep(5);
          end;
        end;
      1:
        begin
        Top := xTop;
        AlphaBlend := True;
        AlphaBlendValue := 0;
        Show;
        for I := 0 to 255 do
          AlphaBlendValue := I;
        TContad.Enabled := True;
        while vCont < 3 do Application.ProcessMessages;
        for I := 255 downto 0 do
          AlphaBlendValue := I;
        end;
    end;
    end;
    vFim := True;
  end;
Self.Terminate;
if Terminated then
  TerminateThread(Self.Handle, 0);
end;

end.

Editado por LucAlucard
Link para o comentário
Compartilhar em outros sites

  • 0

Gente conseguí resolver... mechi em tanta coisa mas não lembro qual delas que resolveu o problema... Por isso estou disponibilizando o fonte do código aqui. E também apenas o .exe pra quem quiser dar uma olhada.

Fonte Funcionando:

http://www.4shared.com/file/3a5u9pE2/Codig...age_Boniti.html

.exe:

http://www.4shared.com/file/EoE4qfhl/Showm...eBonitinho.html

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...