Hirdetés
-
A franciáknak elege van abból, hogy minden gyerek mobilozik
it Vissza akarják szorítani a gyerekek és tinédzserek közösségi média- és okostelefon-használatát.
-
Spyra: akkus, nagynyomású, automata vízipuska
lo Type-C port, egy töltéssel 2200 lövés, több, mint 2 kg-os súly, automata víz felszívás... Start the epic! :)
-
Az Apple megszerezné a klubvilágbajnokság közvetítési jogait
ph A vállalat ezért irgalmatlan pénzt fizetne a FIFA-nak, és ezzel rajzolná át az online streaming platformok háborújában a frontvonalakat.
Új hozzászólás Aktív témák
-
Legyen szíves valaki segítsen. System.IO.Compression-al bohóckodom, biztosan valami bufferprobléma van, de nem látom, hogy hol... Elég béna vagyok
Itt van két nyúlfarknyi kód, az egyikben nincs tömörítés és működik, a másikban van tömörítés és nem működik. Az írásnál nem futok bele exceptionba.
Itt alább ez működik:
Gyártok egy string[] tömböt és elemenként mint szöveget beleírom egy StreamWriter(new MemoryStream)-be. Majd ennek az ellentettje, mindent szépen rendben vissza tud olvasni. Egyszer 1000 utána 10000 elemet próbálok tömöríteni, kiírni.Előre is köszönöm!!!
using System;
using System.IO;
class Program
{
//Gets a string[] array with n data items
public static string[] GetNumbers(int n)
{
string[] numbers = new string[n];
for (int i = 0; i < n; ++i) numbers[i] = (i + 20000).ToString();
return numbers;
}
// writes the string[] array consisting of n items as text to an underlying memory stream
// after that the backing byte[] data structure of the memory stream is extracted via toArray()
// this byte[] array is used to instantitze a MemoryStream and read back the content as text
// this works as expected
public static void WriteReadStrings(int n)
{
string[] numbers = GetNumbers(n);
byte[] data;
using (MemoryStream ms = new MemoryStream())
using (StreamWriter sw = new StreamWriter(ms))
{
int i = -1;
try
{
for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
Console.WriteLine("Current item: {0} \r\nhit key!", i);
Console.ReadKey();
}
sw.Flush();
ms.Flush();
data = ms.ToArray();
}
Console.WriteLine("data size: {0}", data.Length);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
//reading back the compressed stream
using (MemoryStream ms = new MemoryStream(data))
using (StreamReader sr = new StreamReader(ms))
{
while (sr.EndOfStream != true) Console.WriteLine(sr.ReadLine());
}
}
static void Main(string[] args)
{
WriteReadStrings(1000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
WriteReadStrings(10000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
}
}Ok, és most ugyanez tömörítéssel:
Totálisan nem megy. Ha 1000 elemet próbálok tömöríteni, semmi nem kerül bele a MemoryStreambe, ha 10000-et, akkor meg csak valami 8000 környéki. Biztosan valami buffer hiba van, de hol???using System;
using System.IO;
using System.IO.Compression;
class Program
{
//Gets a string[] array with n data items
public static string[] GetNumbers(int n)
{
string[] numbers = new string[n];
for (int i = 0; i < n; ++i) numbers[i] = (i + 20000).ToString();
return numbers;
}
// writes the string[] array consisting of n items as text compressed to an underlying memory stream
// after that the backing byte[] data structure of the memory stream is extracted via toArray()
// this byte[] array is used to instantitze a MemoryStream and read back the content as text
// this does NOT work
public static void CompressAndDecompressStringArr(int n)
{
string[] numbers = GetNumbers(n);
byte[] compressedData;
using (MemoryStream ms = new MemoryStream())
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
using (StreamWriter sw = new StreamWriter(ds))
{
int i = -1;
try
{
for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
Console.WriteLine("Current item: {0} \r\nhit key!", i);
Console.ReadKey();
}
sw.Flush();
ds.Flush();
ms.Flush();
compressedData = ms.ToArray();
}
Console.WriteLine("Compressed data size: {0}", compressedData.Length);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
//reading back the compressed stream
using (MemoryStream ms = new MemoryStream(compressedData))
using (GZipStream ds = new GZipStream(ms, CompressionMode.Decompress))
using (StreamReader sr = new StreamReader(ds))
{
while (sr.EndOfStream != true) Console.WriteLine(sr.ReadLine());
}
using (MemoryStream ms = new MemoryStream(compressedData))
using (GZipStream ds = new GZipStream(ms, CompressionMode.Decompress))
using (StreamReader sr = new StreamReader(ds))
{
string[] separator = new string[1];
separator[0] = Environment.NewLine;
Console.WriteLine("Split returned {0} lines", sr.ReadToEnd().Split(separator, StringSplitOptions.RemoveEmptyEntries).Length );
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
}
}
static void Main(string[] args)
{
CompressAndDecompressStringArr(1000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
CompressAndDecompressStringArr(10000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
}
}[ Szerkesztve ]
-
Vedd ki a flush hívásokat, ha using blockot használsz, mert szükségtelen. De nem vagyok benne biztos, hogy ez okozza a problémát.
A működőben (tömörítés nélkül) kellenek a flush() hívások, próbáltam, anélkül hibázik :
mire ez meghívódik:data = ms.ToArray()
már mindennek a MemoryStream-ben kell lennie.A nem működő verziók (ami tömörít) pedig nem segít, akár bent van, akár nem. Egyébként mindenfélével próbálkoztam, nincs ötletem..
[ Szerkesztve ]
-
Zalanius
tag
válasz joysefke #8004 üzenetére
Pedig ott a flösch környékén lesz a hiba. Próbáld ki így:
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
{
using (StreamWriter sw = new StreamWriter(ds))
{
int i = -1;
try
{
for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
Console.WriteLine("Current item: {0} \r\nhit key!", i);
Console.ReadKey();
}
/* sw.Flush();
ds.Flush();
ms.Flush();*/
}
}
compressedData = ms.ToArray();
}--= Zalán =--
-
válasz Zalanius #8005 üzenetére
Köszönöm!
1, az általad javasolt megoldás működik ( )
2, A
Fush()
megléte, meg nem léte nem változtatott semmit. (kipróbáltam)3, Ami megjavította a kódot az ez volt:
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
{
using (StreamWriter sw = new StreamWriter(ds))
{Ezzel pedig hibázik:
using (MemoryStream ms = new MemoryStream())
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
using (StreamWriter sw = new StreamWriter(ds))
{......}Ne röhögjetek ki, de én azt hittem, hogy a kettő egyenértékű. Rengeteg példaprogramot láttam
using (.....)
using (.....)
{...}sablon szerint, illetve a fönti tömörítés nélküli verzióban ami nem hibázik is több using statementet egymás után van, majd a kódblokk...
[ Szerkesztve ]
-
Miért gondoljátok, hogy a Flush() a using blokkon belül felesleges, ha még a using blokkon belül szeretném, hogy a stream konzisztens legyen azzal amit beleírtam:
byte[] data;
using (...)
{
írás....
sw.Flush();
ms.Flush();
data = ms.ToArray();
} -
fatal`
titán
válasz joysefke #8006 üzenetére
Nem a zárójelek javították meg, hanem az hogy a GZipStream using blokkon kívülre került a ToArray hívás, emiatt nem kell mindent bezárójelezni, de a biztonság kedvéért nem árt.
A flush pedig nem szükséges (mivel a végén van nem okoz problémát, csak kétszer hívódik), mert a Dispose során a Framework meghívja mindenképpen.
-
Köszi!
1,
Nem a zárójelek javították meg, hanem az hogy a GZipStream using blokkon kívülre került a ToArray hívásVak vagyok
Próbálgattam a dolgot, és elegendő volt a ToArray() hívást a StreamWriter- using blokkján kívülre rakni, már az is megjavította (úgy hogy a GZipStream using blokkján még belül volt ) (!!!)
Tehát abban igazad van, hogy ki kellett lépni valamelyik using blokkból.2,
A flush pedig nem szükséges (mivel a végén van nem okoz problémát, csak kétszer hívódik), mert a Dispose során a Framework meghívja mindenképpen.OK, ezt értem, de azt nem értem, hogy az én megoldásom miért nem jó, tehát, ha még a legbelső (StreamWriter) using blokkon belül akarom a ToArray()-t megívni backing streamen (MemoryStream), akkor miért nem működik az, hogy szépen visszafele meghívom a Flush()-öket:
sw.Flush(); ds.Flush(); ms.Flush();
aztán meghívom a MemoryStreamen a ToArray()-t.Itt azt várnám, hogy a Flush() hívások után a a MemoryStream mindent tartalmaz amit beleírtam (kiürültek a bufferek), tehát bátran hívhatok ToArray()-t...
Itt ugye asszinkronitás sincsen, tehát abban a pillanatban amikor meghívom a Flush()-t, akkor már minden írás amit előtte kiadtam már megtörtént (bufferbe)És ez működik is úgy, hogy nincsen tömörítés (DeflateStream vagy GZipStream) hanem csak Streamwriter( MemoryStream()) van. Onnantól kezdve, hogy közé ékelek egy GZipStreamet vagy DeflateStream-et, borul az egész...
[ Szerkesztve ]
-
Uhh
https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush(v=vs.110).aspx
DeflateStream.Flush Method ()
The current implementation of this method does not flush the internal buffer. The internal buffer is flushed when the object is disposed.
GZipStream.Flush() ugyanez...
Mondjuk továbbra sem értem, miért elegendő, ha a ToArray() a StreamWriter blokkján kívül, de a GZipStream blokkján belül van. Azt várnám, hogy ahogy Te tanácsoltad, a GZipStream blokkja után kellene hogy legyen, hogy biztonságos legyen meghívni a ToArray-t. (mert ekkor a GZipStream is Dispose-olva és ezáltal a bufferje is ürítve lett)
[ Szerkesztve ]
-
Tomi120T
újonc
Sziasztok!
Éppen egy projekten dolgoztam visual studióban (xamarin.android), amikor frissítettem és azóta egyszerűen rossz. Az intent osztályra java.Lang.ClassNotFoundExceptoin dob. Valamikor meg az AppCompatActivity ős osztály használatakor az applikáció futásidőben kifagy, egyszerűtől a bonyolult projekttől mindig ezt csinálja.
Aki a xamarint használja vagy a visual studiót és a legújabb verziót használja azok írjanak már hogy nekik működik-e? Mert van egy sanda gyanúm hogy az új verziót elrontották. Vagy hogy kiderítsük hogy én mit rontottam el. -
Pörp
senior tag
Hi!
Azt hogyan tudom megcsinálni, hogy ha pl. egy for ciklussal kiíratom a számokat 1000-ig egymás mellé, akkor egy billentyű lenyomására bármikor megálljon a kiírás, és kezdje el onnantól visszafelé írni? Tehát fusson a program, ami a számok kiírása 1000-ig, de közben mégis várjon billentyűzetről lenyomást, és ha van, akkor annak megfelelően módosuljon a futás. A Thread.Sleep()-el várnék kiírások között hogy legyen idő is billentyűt nyomkodni.
-
Az egyetlen nehézséget az okozza ebben, hogy a Console.ReadKey() blokkol ha éppen nem volt megnyomva billentyű, ekkor addig vár amíg le nem nyomsz egy billenytűt, azt kiolvassa és csak azután megy tovább a végrehajtás. A
Console.KeyAvailable
segítségével ezt ki lehet küszöbölni, ennek akkor ha true az értéke, akkor volt lenyomva billentyű, amelynek az értéke bufferbe került, ezt ki lehet olvasni a Console.ReadKey()-jel, anélkül, hogy az blokkolna.using System;
using System.Threading;
// NonblockingReadKey
class Program
{
// N > 1
static void Count(int N)
{
//this will store the pressed key
ConsoleKeyInfo consoleKey;
// counter will be the running variable
// starting to count down from N
int counter = N;
// when true: counting down
// when false counting up
bool countingDown = true;
// ends one below zero when counting down and one above N when counting up
while (!(counter==-1 && countingDown) && !(counter == N+1 && !countingDown) )
{
Console.Clear();
Console.Write(counter);
Thread.Sleep(250);
// Console.KeyAvailable == true only if there was a keypress
//in the console
if (Console.KeyAvailable)
{
// reads the keypress
consoleKey= Console.ReadKey();
// reads any remaining keypresses from the buffer
// if you have pressed more then one keys during sleep-time
while (Console.KeyAvailable) consoleKey = Console.ReadKey();
// Immediatelly breaks at reading ESC key
if (consoleKey.Key == ConsoleKey.Escape)
{ Console.Clear(); break; }
//switches the counting direction
// true -> false
// false -> true
// countingDown ^= true; ;)
countingDown = !countingDown;
}
//increments or decrements the counter according to
// the value of countingDown
if (countingDown == true) { --counter; }
else { ++counter; }
}
Console.Clear();
Console.WriteLine("Finished!!!");
}
static void Main(string[] args)
{
Count(100);
}
}[ Szerkesztve ]
-
nmate91
tag
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static int Increase(int count)
{
do
{
while (!Console.KeyAvailable)
{
Console.WriteLine($"count: {count++}");
Thread.Sleep(25);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Spacebar);
return count;
}
static int Decrease(int count)
{
do
{
while (!Console.KeyAvailable)
{
Console.WriteLine($"count: {count--}");
Thread.Sleep(25);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Spacebar);
return count;
}
static void Main(string[] args)
{
Console.WriteLine("Press Space to change, and ESC to stop");
do
{
int count = 0;
count = Increase(count);
count = Decrease(count);
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
}
}
}Hasonlo, decrease utan megall, ujra spacet nyomva indul, nullarol. Ha nem nullarol kell, csak ki kell tenni eggyel kijjebb a count deklaralast. Ha kell az 1000 hatarnak, csak a do while-nal kondiciokent kikotod.
[ Szerkesztve ]
-
Zalanius
tag
Még egy variáció alább (.net 4.5+). A fenti kettő amúgy jobb válasz, de eljátszottam kicsit a feladattal async eszközökkel, hátha érdekes lehet. Nem a legszebb a "novekvo" ilyen használata, de ennél a példánál belefér az ilyesmi is, nincsenek más konkurrens részek, amikre még tekintettel kellene lenni. A ReadKey hallgatózás hátránya, hogy ha el is értük a maxot, egy ESC akkor is kell, mielőtt a "Kész..." megjelenhet.
static void Main(string[] args)
{
Console.WriteLine("Befejezés: ESC. Irányváltás: SPACE.");
CancellationTokenSource cts = new CancellationTokenSource();
const int MAX = 1000;
int x = 0;
bool novekvo = true;
Task t1 = Task.Factory.StartNew(async () =>
{
while (!cts.Token.IsCancellationRequested && x < MAX)
{
Console.Write(novekvo ? ++x : --x);
Console.Write(" ");
await Task.Delay(50);
}
}, cts.Token);
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
while (keyInfo.Key != ConsoleKey.Escape)
{
if (keyInfo.Key == ConsoleKey.Spacebar)
{
novekvo = !novekvo;
}
keyInfo = Console.ReadKey(true);
}
cts.Cancel();
Console.WriteLine("Kész. A kilépéshez nyomj meg egy gombot.");
Console.ReadKey();
}--= Zalán =--
-
Pörp
senior tag
Mindenkinek nagyon köszönöm!
-
BTminishop
aktív tag
sziasztok,
winform-ban rajzolok képeket és belerakom őket egy mátrixba, hogy eltudjam érni őket.
for (int i = 1; i <= 8; i++) {
for (int j = 1; j <= 8; j++) {
rect = new Rectangle(x, y, 75, 75);
cells[i-1, j-1] = rect;
Graphics g = e.Graphics;
g.DrawImage(whiteCell, rect);
x += 75;
}
x = 0;
y += 75;
}Speciel ez egy sakktáblát rajzol ki teszt szempontjából még csak fehér cellákkal. Hogy tudnám elérni azt, hogy egy click eventre rá rajzoljon valamit a mátrixból kiválasztott elemre pl. egy bábút. Grafikai dolgok terén itt nem nagyon vagyok tisztában. Köszi!
-
Zalanius
tag
válasz BTminishop #8017 üzenetére
Ehhez előbb a Click eventet elfogni képes elemre van szükség. Többféleképpen is neki lehet vágni, ha mindenképpen szeretnél egy mátrixot, akkor azt fel lehet építeni pictureBox vagy hasonló elemekből is, és akkor a tömb minden eleméhez hozzárendelhető egy metódus rajzolási célból.
De itt akár mellőzhetők is a tömbök, ha "canvas" céljából egy pictureBoxot vagy hasonlót alkalmazunk, és a kattintás koordinátáiból állapítod meg utána, hogy a sakktábla melyik mezőjére kell rajzolni. Tegyük fel, hogy adott egy 400*400 pixeles pictureBox (pb), meg valahol a fájlrendszerben egy kép tesztelésre (queen_41.png), ekkor vázlatosan:
const int WIDTH = 50;
const int SIZE = 8;
const int IMGSIZE = 41;
const string IMGPATH = @"T:\queen_41.png";
public Form1()
{
InitializeComponent();
pb.MouseClick += Pb_MouseClick;
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = pb.CreateGraphics();
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
g.FillRectangle((i + j) % 2 == 0 ? Brushes.White : Brushes.Black, i * WIDTH, j * WIDTH, WIDTH, WIDTH);
}
}
}
private void Pb_MouseClick(object sender, MouseEventArgs e)
{
float x, y;
x = e.X - (e.X % WIDTH) + (WIDTH - IMGSIZE) / 2;
y = e.Y - (e.Y % WIDTH) + (WIDTH - IMGSIZE) / 2;
Graphics g = pb.CreateGraphics();
g.DrawImage(Image.FromFile(IMGPATH), x, y);
}[ Szerkesztve ]
--= Zalán =--
-
XP NINJA
őstag
Sziasztok!
Regex-eket még nem használtam, és most elakadtam.
MatchCollection m2 = Regex.Matches(html, "<td>
<span style=\"font-style:italic;color:green\">\\s*(.+?)\\s*
</span></td>", RegexOptions.Singleline);Van egy ilyen sorom, ami kigyűjti a két megadott részlet közötti szöveget, de nem tudom összerakni hogy ha a color:red akkor azokat is rakja bele. A sorrend fontos lenne, szóval vagy kapcsolatokkal próbálkoztam de nem működik.
[ Szerkesztve ]
-
Sziasztok!
Le akarok szedni YT-ról automatizáltan (barátnőmnek futáshoz) zenéket, mp3 formátumban. Engem nem érdekelnek túlságosan az ilyen olyan kódolások, csak működjön és legyen legalább 192kbps mp3. És lehetőleg tényleg mp3 kódolásban legyen.
Ezt használom YT librariként:
https://github.com/Tyrrrz/YoutubeExplodeA képen egy tetszőleges YT zeneklipphez kinyert AudioStreamInfo bejegyzéseket lehet látni, összesen öt darabot.
Opus AAC és Vorbis típusú kódolású audióstreamek vannak, mp3 sehol. Opusból van három különböző bitrátával.
Van ezzel az Opussal valakinek valami tapasztalata?
-telefonok media playere lejátssza önmagában vagy ez egy WEB-formátum?
-könnyen konvertálható mp3-má? (értelemszerűen .NET-ben)[ Szerkesztve ]
-
Goose-T
veterán
válasz joysefke #8022 üzenetére
Miért pont az Opus az érdekes? Az Android pont a Vorbist támogatja natívan, még a beépített rendszerhangok is olyan formátumban vannak (OGG Vorbis, ha úgy jobban ráismernél). Már ha androidos a telefon, bár más lehetőség nemigen van, mert IOS-re nem teszel csak úgy fel zenéket, a WP meg kvázi kihalt.
Rockbandám: https://fb.me/scharlotterhodes *** Gitárelektronikai műhelyem: https://www.fb.me/goosetgitar
-
válasz Goose-T #8023 üzenetére
Neki pont WP van
Mivel azt látom, hogy a YT videóknál az Opus adja a legtöbb bitráta-opciót, ezért az tűnik a legegyszerűbben használhatónak:
-(1) Minden videóból kiszedem a bitrátában a legjobban illeszkedő (192kbps környéke) Opus sávhoz tartozó uri-t
-(2) Letöltöm az Opus kódolású audió fájlt
-(3) Miután lent van, konvertálom mp3-ra.Ez most a terv. Ha lenne 192-es mp3 sáv, egyből azt szedném le, de az alapprobléma az, hogy:
Egy csomó videónak az audióját szeretném egyszerre letölteni, előre nem tudom, hogy ezek milyen kódolásban, milyen sávszélességekben lesznek fent. A végén pedig egységesen mp3-ban szeretném látni őket. A példaképen (fönt) egyértelműen ez az Opus csoda tűnik a legtámogatottabbnak...
-
Keem1
addikt
válasz joysefke #8022 üzenetére
Csak halkan kérdezem: egy zenestream szolgáltatás nem lenne egyszerűbb? Spotify, Google Play Music, Deezer, Apple Music, stb.
Ezres körüli előfizetési díj, több tízmillió zene, és sohat többet nem kell zenét nagy macerával előtúrni, letölteni, esetleg konvertálni.
Csak meg kell keresni, bekattintani (esetleg listához adni) és már hallgatható. Előfizus konstrukcióban van offline mód is. Ja, és vannak edzéshez, futáshoz való listák (is).Én két és fél éve vagyok előfizető, az elején még nem gondoltam így, de mostanra már az a véleményem, hogy youtube-bal, to..enttel bohóckodjon az, akinek két anyja van
[ Szerkesztve ]
-
-
harylmu
őstag
válasz joysefke #8027 üzenetére
Ez a feladat tenyleg csak max gyakorlasnak jo. Spotify. Megeri, mert sok mindent nyujt, futashoz pl futos playlistet berak vagy barmit. Raadasul a kabellel se kell bohockodni hogy attoltse a zenet.
De a tokonloveshez talan ez a cikk segit: https://stackoverflow.com/questions/20500796/convert-pcm-to-mp3-ogg
[ Szerkesztve ]
-
válasz harylmu #8028 üzenetére
Barátnőm még naptárból is papírt használ, facebookja nincs etc. Az egyetlen stabil pont, amire biztosan számíthatok, hogy meg fog kérni, hogy offline rakjam rá a YT-ról ezt meg azt a telefonjára. Havonta 10-15-20 számot. Fizetni meg biztosan nem fog ilyen streaming csodákért. Én sem. Én zenét sem hallgatok...
tenyleg csak max gyakorlasnak
tökéletes, gyakorlom a Task-async dolgokat
Dobjuk légyszi ezeket a streaming előfizetéseket, a YT videók audió tartalmának párhuzamos letöltését azóta már megoldottam, már csak az Opus -> mp3 konverzió van hátra, azt holnap este megcsinálom.
[ Szerkesztve ]
-
nagyúr
Adott egy solution. Egyik projekt MVC és van egy másik projekt amibe Jasmine van telepítve. Az első projekt script file-jaira szeretnék spec-eket írni. Hogyan hivatkozzam be a fileokat a Jasmineos projektbe?
-
WPF
A letöltés szépen működik meg minden, de belefutottam egy problémába, amit nem tudtam megoldani:
szeretném, ha az összes párhuzamos letöltés állapota egy progress csíkon aggregáltan látszódna, tehát letöltött bájtok/összes letöltendő bájt.Na ezt nem tudom megoldani, nem értem, hogy hol a hiba. Attól eltekintve, hogy már ránézésre is ronda. Már többször átstrukturáltam a releváns kódrészletet, de nem akarja az igazságot, a letöltések szépen működnek, de a progress bar nem moccan. debuggolni sem igazán tudom...
A kód:
MainWindow.xaml.csMiután a user kiválasztotta, hogy mit akar letölteni, kreálok egy progress objektumot (ez fogja a teljes letöltés állapotát mutatni) és ezt illetve a cél könyvtárat átadom a _session objektum letöltő metódusának. Ez a metódus minden fájlt egy egy Task-async művelettel tölt le, amelyek egy-egy Progress<double> objektumon keresztül tudják állapotukat visszajelezni. Ezeknek az egyes Progress<double>-oknak a visszajelzéseit szeretném egyetlen egy Progress<double>-ba aggregálni. Na ez nem megy.
private async void _downloadAudios(object sender, RoutedEventArgs e)
{
...
IProgress<double> [B]progress[/B] = [B]new Progress<double>[/B]([B]a =>[/B] _fileProgressBar.[B]Value = a*100[/B]);
[B]await _session.DownloadAudioAsync(_folderPath, progress);[/B]
}Másik fájl
DownloadAudiosAsync:public async Task DownloadAudioAsync(string downloadPath, IProgress<double> progress)
....
List<Task> dlTasks = new List<Task>();
[B]Itt fogom az egyes fájlok teljes méretét illetve az aktuálisan letöltött
bájt-számokat tárolni. Ezek az adatok az aggregáláshoz kellenek.
[/B] Az összes Action<double> delegate hozzáfér ezekhez és ugyanazt látják.
//[B]long[] bytesDownloaded[/B] = new long[_videoDisplayInfos.Count];
//[B]long[] fileSizes[/B] = new long[_videoDisplayInfos.Count];
//Előre előkészítem a Progress objektumoknak az üres helyet. Az első
tömb fogja a valós, a második pedig a dummy (null) Progress objektumokat
tartalmazni. Indokás később
[B]IProgress<double>[] fileDLprogresses [/B]= new IProgress<double>[_videoDisplayInfos.Count];
[B]IProgress<double>[] progressesEmpty [/B]= new IProgress<double>[_videoDisplayInfos.Count];
[B]A dummy tömböt feltöltöm csupa Progress = null referenciával[/B].
Indoklás később.
for (int i=0; i< progressesEmpty.Length; ++i) progressesEmpty[i] = new Progress<double>();
//összes fájl együttes mérete tárolódik itt
long totalBytesToDownload = 0;
[B]//Ezen a for cikluson belül lesznek megkreálva az egyes Action delegate-k,
melyek elkapják a ciklusváltozót és lemásolják azt. Illetve itt lesznek az
egyes Task-async letöltések elindítva.[/B]
//végigmegyünk a letöltendő videókon
for (int i=0; i < _videoDisplayInfos.Count; ++i)
{
//letöltendő videók letöltésre kijelölt streamjeinek adatait kiszedjük
VideoDisplayInfo videoDisplayInfo2 = _videoDisplayInfos[i];
AudioStreamInfo streamToDownload2=_videoDisplayInfos[i].PreferredAudioStream;
//csak ha létezik a videóhoz megfelelő stream
if (streamToDownload2 != null)
//fájladatokat (név, útvonal, kiterjesztés) kiszedem/legyártom
string fileExtension2 = streamToDownload2.Container.GetFileExtension();
string sanitizedFileName2 = Utils.SanitizeFilename(videoDisplayInfo2.Title);
string filename2 = Path.ChangeExtension(Path.Combine(downloadPath, sanitizedFileName2), fileExtension2);
//fájlok méretadatait elmentem
fileSizes[i] = streamToDownload2.Size;
totalBytesToDownload += fileSizes[i];
[B]//Megkreálom az egyes Progress<double> objektumok action delegate-ját.[/B]
//Minden delegate updatelgeti az őt futtató letöltés által letöltött adatmennyiséget
//Majd meghívja az aggregált delegatet
//
Action<double> action = value =>
{
// captured loop iterator
int index = i;
long fileSize = fileSizes[index];
long totalBytesDownloaded;
lock (bytesDownloaded)
{
long oldValue = bytesDownloaded[index];
bytesDownloaded[index] = (long)(value * fileSize);
totalBytesDownloaded = bytesDownloaded.Sum();
progress.Report(totalBytesDownloaded / totalBytesToDownload);
}
};
//megkreálom a valós Progress objektumokat
fileDLprogresses[i] = new Progress<double>(action);
//Elindítom a letöltéseket a dummy (null) Progress objektumokkal.
dlTasks.Add(_youtubeClient.DownloadMediaStreamAsync(streamToDownload2, filename2, progressesEmpty[i]));
[B]//if blokk vége[/B]
}
[B]//for blokk vége[/B]
}
// Miután kiléptem a for ciklusból és az int i ciklusváltozó érvényét vesztette lecserélem
a dummy Progress referenciákat az igazi Progress referenciákra. A for cikluson belül
nem lehet odaadni az igazi Progress referenciákat, mert az Action delegateben
a ciklusváltozó akkor még érvényes.
for (int j = 0; j < progressesEmpty.Length; ++j) progressesEmpty[j] = fileDLprogresses[j];
// bevárom a letöltést
await Task.WhenAll(dlTasks);
}[ Szerkesztve ]
-
Istenem hogy néz ez ki
-
válasz joysefke #8033 üzenetére
a hiba megvan:
Valamiért nem működik az, hogy menet közben lecserélem a letöltés metódusnak átadott dummy Progress<> objektumot egy igazira. Nem értem, hogy miért, de így van.
Tehát a progress repoltolás itt nem működik a Progress objektum cseréje után sem:
var p = new Progress<double>();
Task t = _youtubeClient.DownloadMediaStreamAsync(streamToDownload, filename, p);
// lecserélem a Progress-t valami olyanra ami csinál is valamit
p = new Progress<double> (value => {....})
await tnem működik.
Nem értem miért nem működik, hiszen a DownloadMediaStreamAsync metódus is az átadott Progress objektumnak a referenciáját használja, _tudtommal_ nem készít róla fizikai másolatot.
szerk:
Uhh bakker, milyen jó volt leírni a problémát, most jövök rá mi a baj[ Szerkesztve ]
-
BTminishop
aktív tag
sziasztok
WinForm-ban csinálok már egy ideje egy grafikus interfészt egy projekthez. Mostanában nem annyira foglalkoztam ezzel a témával de szerintetek érdemes lenne WPF-ben csinálni inkább, mi a különbség a kettő közt illetve mennyire különböznek?
(nyílván rákerestem de személyes véleményekre vagyok kíváncsi)
[ Szerkesztve ]
-
Alexios
veterán
válasz BTminishop #8036 üzenetére
Érdemes, pl. már csak azért is mert jobban skálázódik különböző felbontásokra.
-
martonx
veterán
válasz BTminishop #8036 üzenetére
Winforms a múlt, WPF a jelen / közelmúlt, UWP a jelen / jövő. Aztán persze, ahogy MS váltogatja a technológiáit, ki tudja, hogy az UWP-vel mi lesz hosszabb távon.
Én kérek elnézést!
-
vlevi
nagyúr
válasz martonx #8038 üzenetére
Nekem az egyik bajom az a WPF-el, hogy valami irgalmatlanocsmány módon jeleníti meg a szöveget.
Gondolom azért, mert már nem a WindowsXP-s GDI grafikus megjelenítést használja, hanem Directwrite-ot, de egy átlagos LCD monitoron szinte fáj elolvasni azokat az összevissza álló, elmosódott szövegeket.
Értem én, hogy technológiai fejlődés, mert hardveres gyorsítás, de, ha ennyivel rosszabb a végeredmény, akkor nem ér semmit az egész. -
kw3v865
senior tag
Sziasztok!
Kezdő vagyok C#-ban, és a következő kihívással állok szemben: adott egy C#-os, Visual Studioban megírt WinForm-os desktop alkalmazás, amelyet térképes megjelenítővel kell kiegészíteni. Tehát vektoros objektumokat (ki-be kapcsolható rétegekkel) és OpenStreetMap alaptérképet kell kezelnie, természetesen zoom-mal és mozgatás funkcióval ellátva, illetve az aktuális GPS-pozíciót is meg kell jeleníteni. Találtam 2 olyan C#-os függvénykönyvtárat (SharpMap és DotSharp), ami elvileg erre a célra bevethető, viszont nagyon komoly hátrányuk, hogy gyenge a dokumentációjuk (úgy is mondhtanám, hogy nincs is), és API reference sincs.
Erre a célra JavaScriptben én az OpenLayerst használtam már, ami tökéletesen megfelel erre, remek dokumentációja is van. Szerintetek ez műküdhet, hogy megírom a megjelenítőt az OpenLayers-es eszközökkel, majd egy böngészőt integrálok a Win Froms-os alkalmazásba és úgy jelenítem meg a térképet? Mennyire járható út ez szerintetek? Ti mit javasoltok? -
amargo
addikt
válasz kw3v865 #8040 üzenetére
Winforms ba is megtudsz nyitni böngészőt. Mi a cél? Kell valamire használni az alkalmazáson belül a térképet? Vagy csak valamit meg kell jelenítened?
DevExpress-ben is van térkép, igaz fizetős.“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
kw3v865
senior tag
@ BTminishop
A cégnél C#-ban fejlesztenek, a program 90%-a már meg van írva, évek óta ezt használják, most már térinformatikai funkciókat is akarnak.
@amargo
A Cefsharpot találtam, ez egész jónak tűnik, egyelőre nem látom semmi akadályát a használatának. Egyelőre csak a megjelenítés a lényeg: alaptérkép, rajta vektoros rétegek, ki-be kapcsolgatása, illetve valós időben GPS-pozíció megjelenítése. Erre az általam korábban már használt OpenLayers többnyire alkalmas is.A DevExpress-t nem néztem még korábban, de köszi a tippet, elsőre a doksija alapján jónak tűnik. Nem baj, ha fizetős, míg nem túl drága.
[ Szerkesztve ]
-
zsolti_20
senior tag
Sziasztok! Régen sokat foglalkoztam a C#-al főleg a főiskola alatt, de mostanra eléggé elkopott a tudásom, szeretném kicsit fel eleveníteni ezeket. Valahol találok esetleg leírást hogyan megoldható két gép között a kommunikáció? Szeretnék írni egy olyan programot ahol egy egyszerű beszélgetést lehetne lebonyolítani.
Ez egy gépen még megy is, de a hálózati részével soha nem foglalkoztam még.
-
BTminishop
aktív tag
sziasztok,
WPF-ben miért nem tudok egymás alá Grideket tenni? 8*8-as táblát kellene rajzolnom de az alábbi eredményt kapom
A kódom így néz ki :
StackPanel stack = new StackPanel();
stack.Orientation = Orientation.Horizontal;
Content = stack;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
Grid grid = new Grid
{
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top,
Width = 50,
Height = 50,
Margin = new Thickness(0, y, 0, 0)
};
if (j % 2 == 0)
{
grid.Background = new SolidColorBrush(Colors.Brown);
}
else
{
grid.Background = new SolidColorBrush(Colors.Black);
}
stack.Children.Add(grid);
}
y += 50;
} -
Alexios
veterán
válasz BTminishop #8047 üzenetére
A stackpanel vertical és ne horizontal legyen
-
vlevi
nagyúr
válasz BTminishop #8049 üzenetére
Próbáltad már vertikális stackpanelbe rakni a horizontális paneleket, és abba a kockáidat?
Nem ismerem a WPF-t, de máshol ez szokott lenni a megoldás.Még esetleg a droidos gridlayout jutott eszembe, ott ezt úgy oldottam meg, hogy a gridlayout oszlopszámát változattam, és a gridlayout annyi sorba szervezte a feldobált elemeket, ahányra szükség volt az oszlopszámhoz.
Nem tudom, WPF-ben van-e ehhez hasonló.[ Szerkesztve ]
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Mesterséges intelligencia topik
- E-roller topik
- Hobby elektronika
- Nothing Phone (1) - nem semmi (2)
- Ingatlanos topic!
- iPhone topik
- Vigneau interaktív lokálblogja
- Diabetes - Cukorbetegség
- Vodafone otthoni szolgáltatások (TV, internet, telefon)
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- További aktív témák...
- Lenovo Legion 7, 16,0"WQXGA, Ryzen 9 6900HX, 32 GB DDR5, RX6850M XT 12 GB, 1TB SSD, 1,5+ év garancia
- Corsair RM850e 850W Gold Moduláris Tápegység
- Samsung Odyssey Neo G9 Super Ultrawide Gamer Monitor!49"/Mini LED/5120x1440/240hz/1ms/+Ajándék
- Apple Macbook Pro 16" 2019 i7-9th 6Magos 32/512 -75% Touch Bar HUN Radeon Pro 5300M 4GB 3K Retina
- Apple Mac mini M2 2023 8GB 256GB + Xiaomi Mi Desktop 27"-os FullHD monitor egyben
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: Ozeki Kft.
Város: Debrecen