Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



zamrzání programu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: zamrzání programu

Autor: JaroB

19:49:39 21.11.2010

A jak je oddělené vykreslování od vlastního příjmu dat? Viděl jsem řešení, kdy data ze zařízení, konkrétně telefonní ústředny, byla posílána a zachytávána službou do souboru jako bufferu, a teprve pak, po celých dokončených úsecích vykreslována - ale úplně jiným programem. Mnohdy je problém u úseků, které nejsou dokončené a je ale nutné je tak jako tak vykreslit (například z důvodu timeoutu). To se pak musí nahradit chybějící část aprocimací 1-2 předchozích úselů na základě nějaké podobnosti (třeba metodou zrcadlové kopie). Tohle je ale pak docela problém u zvukových dat, kdy drop-out působí fyziologicky rušivě.

Citovat příspěvek

 

Re: zamrzání programu

Autor: z_o_o_m

17:46:54 21.11.2010

jen tak sem na toto narazil a ani bych se nedivil, ze ti to bude zamrzat ;)

vlakno ma delat vsechny narocne ulohy ...
jakmile provadis rozsahle vypocty v hlavnim okne (ZpracujPrijmutyPaket), tak ti hlavni okno zamrzne

tj. ve vlakne prijmes, zpracujes a v synchronize zavolas nejaky Event, ktery vykresli to, co si dopocital

Citovat příspěvek

 

Re: zamrzání programu

Autor: satikn

17:51:29 16.11.2010

v delphi uz jsem dlouho nedelal, ale napr. v c# se neda jednoduse z nove vytvoreneho vlakna upravovat komponenty na formu a musi se to vselijak obchazet, mozna to bude neco podobneho a bude se to muset nejak obejit..

Citovat příspěvek

 

zamrzání programu

Autor: frankeecz

11:17:30 16.11.2010

ahoj,
nevíte někdo proč mi zamrzá hlavní form ?

postup je následující:
samostatným vláknem příjmám data...
viz unit recieve_thread...
myslím, že pokud volám "zpracuj data v Synchronize je to ok že ?

V procedure ktera obsluhuje prijmuty paket vse funguje v pohode,
jakmile ale nastavuji nejake labely formulare, program zacne zamrzat...


Prilozen je jak unit vlakna pro prijem, tak pod nim obsluzna procedura pro
prijem dat a podprocedurky...

pokud tam nejaké vaše oko uvidí fatální chybu, budu rád.
Jakmile tedy program zkompiluji se zaplou {$define VypisovatLadiciInformace},
zamrzá....

Petr





//-----------------------------------------------------------------------
unit receive_thread;
//-----------------------------------------------------------------------
interface
uses Windows, Messages, SysUtils, Classes, blcksock, dialogs;
type
TPrijmaciVlakno = class(TThread)
private
var
rcvsock:TUDPBlockSocket;
paket: ANSIString;
protected
procedure Execute; override;
procedure ZpracujData;
end;

var
UDPPort : string = '3000';

implementation
//-------------------------------------------------------------------------------------------------------
uses unit1;
procedure TPrijmaciVlakno.Execute;

begin
rcvsock:=TUDPBlockSocket.Create;
rcvsock.createsocket;
if rcvsock.LastError<>0 then showMessage( 'Chyba vytvoreni soketu.');
rcvsock.EnableReuse(true);
rcvsock.Bind('0.0.0.0', UDPPort);
if rcvsock.LastError<>0 then showMessage( 'Chyba svazani soketu, port:'+UDPPort);
rcvsock.EnableBroadcast(true);
if rcvsock.LastError<>0 then showMessage( 'Chyba povoleni broadcastu.');
RcvSock.NonBlockMode := true;

repeat
paket :='';
paket:=rcvsock.RecvPacket(10);
if length(paket) > 1 then Synchronize(ZpracujData);
until (Terminated = True);

rcvsock.CloseSocket;
rcvsock.Free;
end;
//-------------------------------------------------------------------------------------------------------
procedure TPrijmaciVlakno.ZpracujData;
begin
form1.ZpracujPrijmutyPaket( paket );
end;
//-------------------------------------------------------------------------------------------------------

end.


.
.
.
//-------------------------------------------------------------------------------------------------------
// procdeedura ZpracujPrijmutyPaket z hlavniho programu....
//-------------------------------------------------------------------------------------------------------

.
.
v hlavnim formu je docela rozsahla procedura "ZpracujPrijmutyPaket" se spoustou
popdrocedurek.....

.
.
.
//-------------------------------------------------------------------------------------
procedure TForm1.ZpracujPrijmutyPaket( str: AnsiString );
var
HlavickaPaketu,EnitaID : string[32];
// 888 InBuffer : ISLBlockBuffer;
TypPaketu: Integer;

frekvence : int64;
TX_state: word;
TX_state_b: boolean;
RX_state: word;

//-------------------------------------------------------
Procedure ZvucHlasovyPaket;

begin
kodekPrijmutehoPaketu := ord( HlavickaPaketu[22]);
{$ifdef VypisovatLadiciInformace}
kodekPDULabel.Caption := IntToStr( kodekPrijmutehoPaketu );
{$endif}
case kodekPrijmutehoPaketu of
1: kodekPrijmutehoPaketu:=2; // je to mulaw
4: kodekPrijmutehoPaketu:=1; // je to PCM
end;
Inc( PocetPDUZvucicich );

{$ifdef VypisovatLadiciInformace}
if VypisPrijmutehoPDUCheckBox.Checked then
begin
DelkaPrijmutehoPDU.Caption:= IntToStr( length(str));
PrijmanaDataLabel.Caption :=PrevedNaCisla(str);
HlavickaPDULabel.Caption := PrevedNaCisla(HlavickaPaketu);
end;
{$endif}
hlasovyVzorek := VratHlasoveVzorkyStereo( str, RadioZvuciveSluchatku, kodekPrijmutehoPaketu );

if StavKanaluRadia=0 then
begin
BASS_ChannelPause( radio_ch );
StavKanaluRadia := PocetPaketuNezSeZacneZvucet+1; // kolik paketu musi prijit aby se spustil zvuk
//NaplneniBufferuTimer.Enabled := true;
end
else
if StavKanaluRadia > 1 then
begin
dec(StavKanaluRadia );
if StavKanaluRadia=1 then BASS_ChannelPlay( radio_ch, false );
end;

BufferZaplneno_Radio := BASS_StreamPutData( radio_ch, @hlasovyVzorek[1], length(hlasovyVzorek) );

{$ifdef VypisovatLadiciInformace}
ZaplneniBufferuRadiaLabel.Caption := IntToStr( BufferZaplneno_Radio );
{$endif}
//InBuffer := TSLBlockBuffer.CreateData( @hlasovyVzorek[1] , length(hlasovyVzorek) );

// toto neni zcela presne, je to zarovnano pouze bajty, pokud je sample 16bitu , ukazuje spatne
PocetHlasovychVzorkuZaVterinuZvucicich := PocetHlasovychVzorkuZaVterinuZvucicich + Word(length(hlasovyVzorek));

// zde poslat do bass
//SLGenericFilter2.SendData( InBuffer);

Inc(PocetHlasovychPDUZaVterinuZvucicich);
end;
//-------------------------------------------------------

Procedure ZvucHlasovyPaketInterkomu( cisloSmesovace: integer );

begin
Inc( PocetPDUZvucicich );

kodekPrijmutehoPaketu := ord( HlavickaPaketu[22]);
kodekPDULabel.Caption := IntToStr( kodekPrijmutehoPaketu );
case kodekPrijmutehoPaketu of
1: kodekPrijmutehoPaketu:=2; // je to mulaw
4: kodekPrijmutehoPaketu:=1; // je to PCM
end;
{$ifdef VypisovatLadiciInformace}
if VypisPrijmutehoPDUCheckBox.Checked then
begin
DelkaPrijmutehoPDU.Caption:= IntToStr( length(str));
PrijmanaDataLabel.Caption :=PrevedNaCisla(str);
HlavickaPDULabel.Caption := PrevedNaCisla(HlavickaPaketu);
end;
{$endif}

if StavKanaluInterkomu[cisloSmesovace] =0 then
begin
BASS_ChannelPause( interkom_ch[cisloSmesovace] );
StavKanaluInterkomu[cisloSmesovace] := PocetPaketuNezSeZacneZvucet+1; // kolik paketu musi prijit aby se spustil zvuk
end
else
if StavKanaluInterkomu[cisloSmesovace] > 1 then
begin
dec(StavKanaluInterkomu[cisloSmesovace] );
if StavKanaluInterkomu[cisloSmesovace]=1 then BASS_ChannelPlay( interkom_ch[CisloSmesovace], false );
end;

hlasovyVzorek := VratHlasoveVzorkyStereo( str, InterkomZvuciveSluchatku,kodekPrijmutehoPaketu ); // 2=leve sluchatko
BufferZaplneno_Interkom[cisloSmesovace] := BASS_StreamPutData( interkom_ch[cisloSmesovace], @hlasovyVzorek[1], length(hlasovyVzorek) );
{$ifdef VypisovatLadiciInformace}
//ZaplneniBufferuRadiaLabel.Caption := IntToStr( BufferZaplneno_Interkom[cisloSmesovace] );
{$endif}

PocetHlasovychVzorkuZaVterinuZvucicich := PocetHlasovychVzorkuZaVterinuZvucicich + Word(length(hlasovyVzorek));
Inc(PocetHlasovychPDUZaVterinuZvucicich);
end;

//-------------------------------------------------------
Procedure ZpracujHlasovyPaket;
var
EntitaNaCisla: string;
CisloSmesovace: integer; // jedna az pet
begin
Inc( PocetHlasovychPDUZaVterinu );

HlavickaPaketu := copy( str, 1, 32 );
EnitaID := copy( str, 13,8 );
EntitaNaCisla := PrevedNaCisla(EnitaID);

if ZkontrolujZdaJeVeVybranychEntitach( EntitaNaCisla ) then
if ZkontrolujZdaNemluviJinaEntita( EntitaNaCisla ) then
if ZkontrolujZdaZvucetVlastniHlas( EntitaNaCisla ) then ZvucHlasovyPaket;

if ZkontrolujZdaJeToVybranyInterkom( EntitaNaCisla, CisloSmesovace ) then
if ZkontrolujZdaZvucetVlastniHlasInterkomu( EntitaNaCisla ) then ZvucHlasovyPaketInterkomu( CisloSmesovace );


end;
//-----------------------------------------------
Procedure ZpracujRxTxSignal;
begin
//SignalyRxTxProgressBar.StepIt;
//frekvence := ord(str[80]) + ord(str[79]) *256 + ord(str[78])*256*256 + ord(str[77])*256*256*256

frekvence := ord(str[80]) + ord(str[79]) shl 8 + ord(str[78]) shl 16 + ord(str[77])shl 24
+ ord(str[76]) shl 32;
TX_state := ord( str[29] );

TX_state_b := false;
if TX_State = 2 then TX_state_b := true;
str[29]:= '-';
if (frekvence > 100000000) or (frekvence < 200) then
begin
ZkontrolujTransmiteryLisBox( PrevedNaCisla( copy(str, 13,8 ))+'--'+IntToStr( frekvence ), TX_state );
ZkontrolujFrekvenceListBox( IntToStr( frekvence ), TX_state );
ZkontrolujEntityNaVybraneFrekvenci( PrevedNaCisla( copy(str, 13,8 )),IntToStr( frekvence ),TX_State_b);
ZkontrolujInterkomyNaVybraneFrekvenci( PrevedNaCisla( copy(str, 13,8 )),IntToStr( frekvence ),TX_State_b);

if JeProvozNaVybraneFrekvenci then ProvozVysilacka := 1 else ProvozVysilacka := 0;
if JeProvozNaVybranemInterkomu then ProvozInterkom := 1 else ProvozInterkom := 0;
NastavVysilaniNaVysilacce( ProvozVysilacka, ProvozInterkom );

//if JeProvozNaVybranemInterkomu then NastavProvozInterkomuNaVysilacce( ProvozInterkom );
end;
end;
//-----------------------------------------------
Procedure ZpracujRecieveryPDU;
begin
RX_state := ord( str[22] );

ZkontrolujRecieveryLisBox( PrevedNaCisla( copy(str, 13,8 )), RX_state,'' );
end;
//-----------------------------------------------
Procedure ZpracujOstatniPakety;
begin
if TypPaketu = 25 then // transmitter PDU
begin
{$ifdef VypisovatLadiciInformace}
PaketTransmiteruLabel.Caption := PrevedNaCisla(str);
{$endif}
ZpracujRxTxSignal;
end;
if TypPaketu = 27 then // reciever PDU
begin
{$ifdef VypisovatLadiciInformace}
PaketRecieveruLabel.Caption := PrevedNaCisla(str);
{$endif}
ZpracujRecieveryPDU;
end;

end;
//-----------------------------------------------
begin
if length(str) > 5 then
begin

Inc(PocetPDU);
inc(PocetPDUZaVterinu);
TypPaketu := ord(str[3]);

TimeStamp := copy(str, 5, 4 );
//If TimeStamp <> MinulyTimeStamp then // brani proti dvojitemu prijmu
begin
MinulyTimeStamp := TimeStamp;

if TypPaketu = 26 then ZpracujHlasovyPaket
else ZpracujOstatniPakety;
end; // stejny paket == stejny timestamp
end;


end;

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: