GraphicsCanvas - How to hide it properly?
Archives Forums/Linux Discussion/GraphicsCanvas - How to hide it properly?
| ||
Hi! I'm using a canvas in order to display a logo and a spectrum analyser. The issue under Linux: The canvas will still receive updates via eventhooks even if the MainWindow is hidden behind other windows?! Example: ![]() I could call it a feature. But I'd rather like to get rid of this... :( Any work around present? Grisu |
| ||
double post Last edited 2012 |
| ||
couldn't you deactivate the event listener on "app hidden" ?. How did you connect your event listener? I do not have problems with the max2d-canvas on background windows... the above code is an excerpt from a custom class. - which uses the canvas and is drawn here on linux mint 64 without problems (using fltk). bye Ron edit: code->codebox Last edited 2012 |
| ||
Dunno why the above is posted twice... maybe one is not allowed to "edit", alt+left, edit again... Ok here is some test code... it redraws the background although if the app windows is not running in front. edit: code->codebox Last edited 2012 |
| ||
Thanks for looking into this. The BMX IDE keeps crashing for me. So I couldn't do much with BMX-wise under Linux. :( I use a much simpler approach to redraw the canvas: Your source code #2 shows exactly the same issue that my code has. :( While the BMX IDE worked, I compiled a full version of my radio player to show this and other issues (hidden panels/GadgetRedraw issues etc). Download #3 (~11 MB): http://www.mediafire.com/?aks4rel8y239pru Last edited 2012 Last edited 2012 |
| ||
The BMX IDE keeps crashing for me. Oh dear... You can compile on the command-line if you know the right parameters to pass to bmk. |
| ||
Your download links to "icontest" (source) which runs flawless. ->stays in background and nothing is drawn -> no icon is shown (just gray background). Are you running the latest blitzmax ? What OS? bye Ron edit: what do you mean with "keeps crashing" - if the ide runs but suddenly crashs while editing - that sounds like some problems. If the ide just wont start - try to run it from the commandline. In your response please include what kind of "crash" you mean. Last edited 2012 |
| ||
@Brucey: The IDE keeps "hanging" after I use the scroll bar to scroll down in my code. Maybe it got sick of my code... XD P.S.: Nice to see you back on the forums! @Derron: Ups, wrong link. Fixed. Please download again. Yes, from this site. But I use the default MaxGUI module. Nothing from Brucey. Except a modified fmod module. OS: Ubuntu 12.10 (32 Bit) Last edited 2012 |
| ||
Your testfile works (after I installed your .so file and "ln -s"ed it). Although it looks a bit like a nagscreen overlaying the grayish background until the "radio stations" are loaded...afterwards the image is drawn properly). All stays in background if i defocus the app (bring another to the front). bye Ron edit: i am running linux mint 13 64bit here... so it is using gtk like yours. Did you check it in a virtual machine (booting a live cd)? So you can easily check numerous OS. edit2: do you have compositor activated (shadows around your windows etc.) - test if running flawless if deactivated - maybe something with your opengl is interfering. Last edited 2012 |
| ||
Nothing from Brucey Yeah, cuz that would be the death knell of anything ;-) |
| ||
Lol. Maybe he meant: brucey is using magic - and all know, magic only works if you believe in it :D. edit: thanks for updating your ***-blog @ brucey Last edited 2012 |
| ||
@Brucey: More like: If it isn't working -> it's the result of my bad code and not yours.... ;) @Derron: Thanks for the feedback. You need to play a station and then defocus the window! Guess I need to figure out on how to fix the startup screen. It should look like this. At least it does under Windows and Mac: ![]() Could you please check the updates function. Is it working for you? From the station screen window -> go to "About" -> "Check Updates". I'm using a virtual box with a fresh installation for testing purposes. Last edited 2012 |
| ||
updates function (icons are hmm ... may be enable added text labels by default - i just found the correct ones as no others were present :D). i pressed update: ahh ... ok ... something changed now (last run was ok). I pressed update - surfed to your PRP-website and re-tabbed into the app, the main panel of the app is not redrawn (presenting a bit of my application switcher). Application exiting is also not possible (xkill it) Third try: everything works. I defocused the app while playing hitz.fm or so ... no problem. VirtualBox ... hmm maybe that is a reason as their opengl-"driver" is not 100% capable of doing opengl :D for you in German (to avoid misunderstandings): Beim Alt-Tabben hat es den Fensterinhalt nicht neu gezeichnet (auch nicht nach Minimieren etc.). Irgendwo hat es wahrscheinlich auf die Antwort von einem Server gewartet und damit die Applikation eingefroren. Abspielen ging wie erwartet, auch Kuenstlerinformation wurde korrekt aktualisiert. Probiere es mal auf einem realen Linux-Desktop, VirtualBox ist nicht komplett kompatibel zu OpenGL ... bzw muss man die 3D-Beschleunigung aktivieren (abgesicherter modus) bye Ron edit: please put the data fetching in a different thread... apps not responding while waiting for data... this is really oldschool. And as enduser you do not know whether the app is frozen or what happened now. Last edited 2012 |
| ||
update: one of your apps instances still run in the background hogging up 25% of one of my cores... GUI-Apps should stay < 5%. bye Ron |
| ||
The app instance still running should be the one that crashed. I doubt my app will ever use 25% of a PC core. I uploaded another version (link at post #5). This version should fix your ALT-TAB and Minimize issues. In addition I updated some recently broken station files. I don't know how to handle threads in bmx. Doesn't this require Brucey's "Alice in Wonderland" compiler? ;) |
| ||
It just needs "compile threaded" and the special thread-commands. As your app is MVC or "user control vs audio output" it is made for threading. Equalizer-animation etc would be done in the main thread, audio and data fetcher in other threads. @25%: if an app crashes, it should not increase its hunger for cpu time... so something else happened there. bye Ron |
| ||
Doesn't this require Brucey's "Alice in Wonderland" compiler? ;) Hey! Who the … is Alice? :-p As Derron says, anything that isn't GUI related could be done in a background thread. FMOD should already be doing that anyway, and you can continue to call update() in the main thread. Any fetches for data you are doing yourself to the internet, should be done as a background task, so that the UI remains responsive at all times. Once the stuff is fetched, you can set a flag or something that you look at every so often and react to it - updating a list or some such. |
| ||
So all I have to do is to is to shift the "file download" below to an extra thread and wait till it's done? Or is that approach too simplistic? Last edited 2012 |
| ||
Instead of using different "saveBank"-styles just decide globally what kind of directory limiters you use (slash or backslash). The Approach is: Maybe that helps |
| ||
It took a while, but helped... :) The file downloads now use a child thread. Not sure if these changes solve your issue a bit though: http://www.mediafire.com/?aks4rel8y239pru I had to use "WaitThread()" in order to determine when the child thread is finished. The visible "input lag" is a result of the "SaveBank()" command it seems. I also recognised that the translation phrases are somewhat "broken". :/ Is there a way to force Linux to load a plain text file in the "Windows format". So German umlauts etc are displayed correctly? |
| ||
I had to use "WaitThread()" in order to determine when the child thread is finished. Well, that mostly defeats the purpose, doesn't it? Generally you need a design change if you introduce multi-threading that is doing things like loading stuff - i.e. your program can continue doing its thing before the file has finished loading, and not just pausing. If you must pause anyway, there's not much different in using a background thread. What's a Windows format file? You mean like Windows1256 code pages or such things? Better to have your files in UTF-8 format, otherwise you need to know what the format of the file is, and convert it as it loads. I think the TextStream module can handle the basic UTF-8 ones. If you need more support, something like BaH.libiconv can help (since that is what it is designed to do). |
| ||
umlauts (äüß etc.) : just save your files using utf8. Like Brucey said: textstream can handle this. For umlauts within the sourcecode, that files have to get saved as utf8 too (simetimes it is needed to even store with BOM...). Multitasking: again like Brucey said, do not wait for the results to be there. Example: Store all stations in a list If the Backgroundfetcher modifies the data, it does: LockMutex( _self.MutexContentLock ) list.addLast(data) UnlockMutex( _self.MutexContentLock ) That means: set a value to true - or wait until I am able to do so (lockmutex waits until sucessfull). In your main thread - you do the same (although read access is easier) Your main thread should also try LockMutex( _self.MutexContentLock ) 'work with the data list - eg read modify etc. UnlockMutex( _self.MutexContentLock ) As long as the backgroundfetcher locks the "MutexContentLock", the main thread will wait with list processing until the fetcher has unlocked. That lock will only be used when changing shared data (the list), the real fetching work is done without interrupting the main thread. So you "SaveBank" outside of the "lock-action-unlock" chain - and no disturbing pause-effect will be shown to the user. Your "broken phrases" - that is because I print to the output of the whole app. Text isnt printed "at once" - imagine each char is sent to the outputbuffer alone. The Main thread is sending 2 chars and baemm now the sub thread is sending 1 of its 10 chars... the result is a mixture :D. If you buffer your output to a list and print out that list "time by time" (with lock mutex etc when adding) you circumvent this. Call it "TBufferedOutput", add a field list, a mutex and "addLog"/"outputNew"-Method ... there you go. Another hint for "testing for updates" ... add: field hasToUpdate:byte ?Threaded field hasToUpdateMutex:TMutex ? '....in your update methods LockMutex(hasToUpdateMutex) hasToUpdate = 1 UnlockMutex(hasToUpdateMutex) And check versus that boolean in your main loop.... I am not sure but I think read access to a byte could be safe even without a locking mutex ... but better add one :D. Short Summary in German: - WaitThread brauchst Du nicht, einfach mit "LockMutex" arbeiten, dass wartet solange, bis der Mutex freigegeben wurde (UnlockMutex), dass heisst waehrend dein Subthread in die Datenliste schreiben will, lockt er einen mutex, schreibt rein und gibt den Mutex wieder frei. Dein Mainthread lockt vorm lesen der Liste ebenfalls den Mutex - sollte in dieeeessem Moment der Subthread auch schreiben - wartet "LockMutex" bis "UnlockMutex" aufgerufen worden ist. Dadurch kann es keine konkurrierenden Situationen geben - einfach "LockMutex" nutzen. bye Ron PS: write and I will code a small "RSS"-Fetcher-App which fetches data in the background etc... hmm think I will do that even now Last edited 2012 |
| ||
Ok there was 1 small mistake in my prior code. The DataFetcher locked a mutex just for adding something to the data although the loader-method already manipulated the list... don't do that :D The following piece of code emits an event in case of remote data was loaded. If eventemit is somehow not threadsafe - replace that part with the thing I described one post ago (hasToUpdate-Flag). |
| ||
Derron, your German is almost as good as your English ;-) EVENT_REMOTEDATA .. cool :-) |
| ||
Just thought about the event-params. Imagine only "references" are sent with TEvent ... if then modifaction takes place problems may arise. Better/Safer it seems to make real copies. Instead of making real copies on emit one should consider doing that on "receive". Why? Imagine the datafetcher-listener being kind of an module. Why copying data (->work) each time the event happens. Just do that work in case one listens to that event. In our case the "simplest" thing is: lockmutex on remotedata-event, copy the list entry by entry, unlock an mutex. @German: may be the reason is my place of birth (still living here in Chemnitz, Saxony, Germany). But thanks for the compliment concerning English. bye Ron |
| ||
Thanks again for that input. @Threads: Is the maximum number of threads limited automatically? E.g. the available cpu cores on the current system? I found some Windows code to detect the maximum number of CPUs available, but nothing cross-platform. If I start to download 1000 small files (each one thread), the file server might not like this at all. Therefore I would need to limit the current threads to 8 or so. @Localisation files: I'm about to dumb all my localisation code and start fresh. I found Bucey's old "Locale" module. The examples run fine under Windows, but still no luck under Linux (see screenshot below). ![]() Am I missing some core Ubuntu library that causes the problem? What else can it be. |
| ||
Try running the example on the console/terminal, and see what the results look like. On Linux, DO NOT trust the Output window in the IDE. Really. |
| ||
It's the MaxIDE that fail to output correct locals.. Run the example in a console, and it will be fine. |
| ||
Or use my Geany-version for correct locales output. @threads. NEVER run 1000 threads vs remotely located URIs... Germany does not like "criminal acting" and 1000 concurrent requests are utilizing more power than needed -> you can get problems with "ddos"ing - although you do not do that ofc. But hey...why 1000 threads to load the data... Just let one datafetcher-instance do the job, url by url. Each time it finished loading the remote data an event is emitted - and your gui can fetch the "new" data (meanwhile the datafetcher will fetch the next one ...). You can split that fetching into some more worker threads, but this only improves the situation if remote servers are slow and take ages to respond. -> use <5 workers, that will do. -> you can kill the workers if they do not bring results (call it "timeout" :D) so you do and need: - set of workers (data fetchers) - set of "toLoad"-Elements - each time a worker finishes fetching data: emit event with data - each time you get an "remotedata"-event, you propagate that fetcher to load another element (mark it as used or remove it from the list) so you end up with a kind of "loop" which finishes alone if no data is left in the "toLoad"-List. To Start it - manually kick off remote-Loading for each worker (for local worker:TWorker = eachin workerList ...) You can even make it more self-contained with the workers listening to "newToLoadElement"-Events ... but that is overkill. bye Ron edit: PS: this is nearly the same method I load my Ressources (Ressourcemanager can be threaded or not... in case of threaded it loads images as tpixmap and appends them to another list which is loaded from the main thread - as those are allowed to access the gfx-context) Last edited 2012 |
| ||
I need to see the phrases inside a GUI app. As this quick & dirty example shows, it's not working. |
| ||
I do not have bah.locales installed (and are on my way to dads birthday... and my rum with fruits from the summer is awaiting to get unboxed :D). But: is the ".blf"-file ascii or binary? if it is the first: save it with utf8-encoding. Save your sources with utf8 if you have strings in there too. To ensure the ladder one: textareaObj.AddText("Ehne Mehne Mühe, wir alle lieben Kühe") If that is print correctly (remember to save your .bmx with utf8 - that isn't done with the normal IDE) than you know what to do. Geany, Gedit, etc - they are able to safe as utf8-encoded textfile. bye Ron |
| ||
Here we go again. I've managed to implement the new updater code. While under Windows it runs fine, no more stuttering while the download is in progress. The bad news: under Linux it doesn't seem to catch the custom event. So the updater "hangs" while downloading the first file from the server. :/ I added a DetachThread to your code in order to prevent a memory leak. Newest Build: http://www.mediafire.com/?z3b3cibb23h5hgo Sourcecode: As the BMX IDE can't handle utf8 properly (= i.e. switching from Win7<->Linux<->Win7) I'm going to use external files for all my text labels. Not very fancy but bulletproof. Does Linux require some special code in order to display an image icon (16x16) for an app? I'm using the code from the bmx ide source, but the icon isn't displayed?! ?linux SetGadgetPixmap (MainWindow , LoadPixmap("Incbin::./data/prp16.png"), GADGETPIXMAP_ICON) ? Last edited 2013 |
| ||
- DetachThread - we reuse the same variable for the threads, so this should not be that big point - The sample code does not show how you implement your custom event. As my "EVENT_REMOTEDATA" was catched like it should - I think you did something differently than me - Icon: I think displayed icons are stored externally eg usr/share/icons and the system tools will have a look there (in your case nautilus as file explorer when displaying the desktop or the file explorer itself) edit: - "the updater hangs" - the good thing is: only the updater hangs, the rest of the gui and app will keep being responsive :p. bye Ron Last edited 2013 |
| ||
Here's my main loop. Can't figure out why it stops. Sometimes 3 files are downloaded. Sometimes 6 or more. - Then it "hangs" = no event incoming. 1. I create a custom array (FileArray) which holds all filenames that need to be downloaded. 2. Then I start one download thread in order to get things started. 3. Enter the main loop 4. Catch the EVENT and UPDATE all treeview informations / progress labels 5. Start the next thread until all files were downloaded. Font issue: Do you know of a way to force BMX to use an arial like font under Linux? In former MaxGUI releases bold text labels were shown correctly. The default font seems to be different and the labels are not bold anymore. New vs. Old: ![]() Last edited 2013 |
| ||
fonts: this may be caused by fltk as it is not using the gnome-settings all in all - but prior compilates (using the gtk bindings) might have done that. Maybe you have done a completely new installation so some "user configs" are missing. ' Create Index entries from the Downloadlist For tmp = EachIn download_list Hope you compile (super)strict and declared tmp before... codelines like Progress_curr:Int=Int(Progress*100) Do not make me believe in that (why declaring an variable as :int if it is already declared as an int before (<-- assumption) So - the loop looks like: 1. first call to load a file 2. loop 2.1 loop event "remotedata" received - process it and start new thread Question: is Print "EVENT_REMOTEDATA: "... working but Print "Next file ----- No... missing ? Again I want to cite myself: I am not sure whether the event-system is thread safe or not. Instead of using the EmitEvent-Style, you could also have a global within TDataFetcher -> Field newRemoteData (or hasToUpdate ...). You then just check versus that integer-field whether to do something or not. You may use Events there... but in case of events getting "lost" you also are able to use a timer and check each timer_tick if the "hasToUpdate" variable is 1 or 0 or whatever. You could also have integer fields holding information about "used" DataFetchers and a "available" amount of DataFetchers. Check whether the list of still-to-fetch-data is longer than the amount of unused DataFetchers - and then give them something to do. Just think a bit about it, then you will surely get around it by yourself. bye Ron edit: a) keep in mind that "singleton" (getinstance() ...) means: there is only 1 instance of that class available. b) if events are not threadsafe do not try to do: ...loadRemote(a) ...loadRemote(b) They all would Emit the RemoteData-Event. Now imagine 2 of that loadRemote-threads finish nearly the same and try to emit the event... in both cases the event-system adds eg. event number 3, will then increase the next "ID" to 4 - but before doing that the next thread adds his event as 3rd and wants to increase to 4. So 2 events become 1. Making the event-system taking care of threads is really "easy" - like we have done it with the datafetcher, just lock a mutex before changing eg. a list - or looping through it (do not know much about the iterator system). A custom event-system is no magic and also allows firing an event in just that moment instead of waiting for an "WaitEvent" or "UpdateEvents" call. This is nifty in case of immediate calls instead of "1 update loop later". Last edited 2013 |
| ||
I've created a simple source code file that runs fine under Windows. There has to be a simple issue I'm unable to detect that stops it from working under Linux. - If anyone wants to give it a shot under Linux or Mac, be my guest. Source code (70 kb): http://www.mediafire.com/?idbgxbvcbemc77i |
| ||
Import BRL.GLGraphics Import BRL.GLMax2D --> imported twice Import BRL.retro --> is missing but added because you use gman.zipengine (i commented that out) you commented out "?Threaded" but left the corresponding "?" uncommented alive. you use conditionals for win32 and rest but are using: Print "Saving "+CurrentDir()+""+Dest without proper directory-separator-variable. But to give some real help: You may recognize that my downloadmethod did not use LoadBank but yours does... there you got your problem. bye Ron edit: [bbcode] Function HTTPGetFileStation:Int(url:String) 'Print "HTTPGetFile "+STATIONS_DIR+url local delimiter:string = "/" ?Win32 delimiter = "" ? Local filePath:string = CurrentDir() + delimiter + STATIONS_DIR + url url = (ini_update_server+"stations/"+url).Replace("http://", "http::") Print "Loading stream "+url local inStream:TStream = ReadStream( url ) local outStream:TStream = WriteStream( filePath ) while not Eof(inStream) outStream.writeByte( inStream.readByte() ) Wend Print "processing stream done" inStream.close() outStream.close() if filesize( filePath ) = -1 Print "Error: Saving File to " + filePath Return -1 else Print "Saved File to "+ filePath Return 1 EndIf End Function [/bbcode] should work - although there is a better method. edit2: I now understood why the event firing was working but "slow" (you had to wait a second until the next thread starts etc.) It is because no event happens the event system will care of. So before your "repeat"-loop (after the first eventemit) add: [bbcode] 'check every 10 ms - so make a timer tick to satisfy "WaitEvent" local FasterEventCheck:TTimer = CreateTimer(1.0/100.0) 'check every 10ms [/bbcode] After the loop you will just have to delete the timer (so it wont tick needless :D) This will make the event "timer tick" firing every 10ms - and therefor other events will get checked too. So the problem of "waitEvent" is, that it relies on getting system events - and no custom ones. There is no better reason to use a custom event manager with direct fire/trigger-ability in combination with a timer which triggers every 10ms (yeahh i know... power consumption ...). Last edited 2013 |
| ||
I am not sure whether the event-system is thread safe or not. The event system is not thread safe. |
| ||
I'm pretty sure something like libcurl can do background fetches of web data so you don't have to arse around in BlitzMax code to handle multiple threads of fetchyness. |
| ||
Thanks for the help everyone! It's really appreciated. @Derron: Under Windows you extra timer speeds up things. But on Linux the code "hangs" as I'm used to see it (with or without the extra timer). Don't want to imagine what the code does under a Mac OS. @Brucey: I got libcurl from SVN. Could you please give a simple example on how to download and save a file from an url with it. I've checked the ones included without success. |
| ||
Very crude example of how to use libcurl. |
| ||
The problem with TCurlEasy is it is blocking by default. If you want to something more useful, you need to use the "TCurlMulti" interface, which is a non-blocking interface. @Grisu : I rewrote your TestLoader2 example to use libcurl multi, and it appears to run fine on Mac (where I wrote it) and Linux (where I tested it). UI remains reasonably responsive while performing 8 concurrent downloads of prp files. It runs off a 10ms timer tick which causes it to process the current downloads. As each download is complete, it closes that file stream, and pulls another one off the "todo" list, reinitialising the connection and commencing download. When it is finished, it should clean itself up, but I haven't tested it 100%. The only messy bit (IMO) is the tree update inside the process(), but since you want a live update of available files in your tree, I couldn't think of anywhere else to put it. Well, you can see how well it performs for yourself when you run it. On Linux you'll need libidn (dev) if you don't already have it to compile libcurl. Oh, it runs fine non-threaded. I haven't tested it while running threaded, but it should work the same for both. Last edited 2013 |
| ||
I think it is a reasonably good example of how 3rd party libraries can be used to prevent the need to re-invent the wheel so often. I always find it interesting how many wheels I see re-invented on the forums. Of course, I understand how "cool" it is to be able to write something completely in BlitzMax code, but often 3rd party libraries can do the same work better and faster than pure BlitzMax code. Still, choice is also a good thing, so :-) |
| ||
Thanks! That helped a lot. If you don't know it better than you'll have to reinvent the wheel. ;) In my first tests I recognised that your routine will create empty prp-files when you interrupt the download process. Therefore I'll add some extra code to delete such files. I did the treeview list so that users can recheck what changes were made and directly run a new / updated radio station from there. In order to optimise the code a bit I think I can get rid of the Filearray. As most stuff needed is already in the "download list". Did you change much in the libidn (dev) version. I downloaded the full SVN list of modules but it's not in there. It's great that might not need to run threaded. As I found out BMX uses more memory for this and the garbage collector seems to act slower. In addition I might use the lib for file loading (from HD) as well, which might give the whole app a small speed boost. But first things first: I need to test my full code on all platforms. This will take a while. Too bad this weekend is nearly over. |
| ||
@Brucey: if using only blitzmax, you only have to rely on its internals. If using your libcurl, you have to install mingw, have to assure your lib working etc. Yes libcurl is a really round wheel with not much work to be done for getting it doing what you want. @grisu: I coded my example using Linux Mint 13 64Bit - and it worked fine. Replace "WaitEvent" with "PollEvent" and it will hang less between the downloads - and it takes away the need of the timer. bye Ron edit: take also into consideration that the used method was a kind of idea making ressource loaders thread friendly... but as events aren't you should not care that much (except you alter the event system to use mutexes in the case of an threaded compilation). Last edited 2013 |
| ||
Did you change much in the libidn (dev) version I only mentioned libidn because the header was missing when I tried to build on Linux, so I needed to install the libidn dev package. The library itself is usually installed on Linux by default. if using only blitzmax, you only have to rely on its internals Indeed, but since BlitzMax internals are lightweight to say the least, I think it's better to use the right tool for the right job. And if you are a programmer, using MinGW and third-party libraries should not be a wall against which you cannot climb (or knock down). For someone who says "Well, if it doesn't come with BlitzMax I'm not using it" , I feel rather sorry for, as if they want to hide in their shell and never see what the real world can offer them, then it's really too bad, and their software might be worse off for it. I tested my example using Linux Kubuntu 64-bit (headless) - and it also worked fine ;-) |
| ||
Solve one problem get another: GetFile.Free() isn't properly deleting all open file handles if one aborts the current download. MaxConnections-1 empty files stay inside the stations folder. I thought it would be easy to use deletefile() inside the Method Free(), but the files seem to be "protected" (still in use?). Thus deletefile() fails. So I tried to delete them in the main program after exiting the loop, by going through the stations folder again and detect all files with filesize=0. The accoding files still can't be erased. Deletfile() returns = 0. I can delete them by hand though, but this is no valid option... ;) - Any ideas on that? On the bright side: The code works fine under my Ubuntu 12.10. You can grab an updated full distribution test package from below: Linux Download: http://www.mediafire.com/?7rzethd7jbdmdpv Last edited 2013 |
| ||
The streams will need to be closed first before you can delete the files. And before that, probably to shut down the curl connections. The best thing to do will be to close the multi handle, then close all of the easy handles, then close all of the streams... |
| ||
These changes work fine... Testing... Last edited 2013 |
| ||
Probably better to cleanup the curl first before you close the stream. |
| ||
Done and added another life line. |Edit| The Linux test package has been updated accordingly. Last edited 2013 |