Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Principal";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

Para baixo

Tópico: Suspender / Retomar e Sincronizar Encontre agências semelhantes


mitry   (2001-12-15 02:53) [0]

Caros colegas, ajudem, por favor, eu não dormi 3 noites já.
O problema é:
Se você freqüentemente suspender (suspender) e iniciar (retomar) o segmento que chama Sincronizar, em seguida, quando você redesenhar a janela, o programa geralmente trava.
Por exemplo, se você executar o programa a seguir e alternar entre ele e o Delphi, o aplicativo abaixo ficará em silêncio para sempre:

usos
Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários,
Diálogos, ExtCtrls, StdCtrls, ComCtrls;

tipo

TMyThread = class (TThread)
privado
atualização do procedimento;
protegido
execução do procedimento; substituir;
end;

TMainForm = classe (TForm)
Timer1: TTimer;
procedimento FormCreate (Sender: TObject);
procedimento FormClose (Sender: TObject; var Action: TCloseAction);
procedimento Timer1Timer (Sender: TObject);
privado
{Declarações privadas}
MyThread: TMyThread;
público
{Declarações públicas}
end;

var
MainForm: TMainForm;

implementação

{$ R * .dfm}

procedimento TMyThread.Update;
começar
//
end;

procedimento TMyThread.Execute;
começar
repetir
Sleep (100);
Sincronizar (Atualizar);
até terminado;
end;

procedimento TMainForm.FormCreate (Sender: TObject);
começar
MyThread: = TMyThread.Create (false);
Timer1.Interval: = 1;
Timer1.Enabled: = true;
end;

procedure TMainForm.FormClose (Sender: TObject; var Ação: TCloseAction);
começar
Timer1.Enabled: = false;
if MyThread.Suspended então MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;

procedure TMainForm.Timer1Timer (Sender: TObject);
começar
se não MyThread Suspended então MyThread Suspender else My Thread.
end;

Tudo isso é necessário para isso: Eu fiz um botão animado: você aponta para ele com o mouse - o fluxo começa a tocar, reproduz a animação, você remove o mouse - o fluxo pára. O usuário pode carregar o mouse com bastante frequência, o que leva ao problema acima.
Meu programa não pode usar o Timer em vez de fluxos.
Se alguém lhe disser qual é o problema, darei a ele meus melhores componentes (incluindo um botão animado). Eu juro solenemente.
Peço desculpas pela longa pergunta, mas em resumo não pode ser.
Delphi6, Win98.
Obrigado.



paul_shmakov   (2001-12-16 02:06) [1]

Usando suspender / retomar não é a melhor solução neste caso. E o uso do fluxo para cada botão também é ruim. mas uma vez que você precisa de um fluxo, então porque não torná-lo mais fácil: quando surge a necessidade de começar a tocar a animação, definimos o sinalizador, o método execute verifica esse sinalizador e, se estiver definido, desenha a animação. quando o cursor se foi, nós redefinimos este sinalizador.
a única coisa que não houve problemas, a bandeira deve ser alterada chamando uma das funções Interlocked *. por exemplo, InterlockedIncrement / InterlockedDecrement.

"Peço desculpas pela longa pergunta, mas de jeito nenhum pode ser."
todas as perguntas seriam tão longas e detalhadas :)



Страницы: 1 filial inteira

Fórum: "Principal";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

em cima









Memória: 0.56 MB
Hora: 0.035 c
4-22478
Ross
2001-08-28 16:53
2002.01.08
Início do menu


4-22481
Stropal
2001-11-03 10:44
2002.01.08
Impressoras de trabalho diretamente. Aconselhar


1-22055
walker_ag
2001-12-19 03:27
2002.01.08
Como fazer isso?


6-22271
vencedor
2001-10-04 20:15
2002.01.08
em uma conexão a conexão remota não apareceu ????


3-21913
SklifF
2001-12-03 19:08
2002.01.08
Coluna Soma Pro





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese romeno Russa sérvio Slovak esloveno espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol