Tilted Forum Project Discussion Community  

Go Back   Tilted Forum Project Discussion Community > Interests > Tilted Technology


 
 
LinkBack Thread Tools
Old 05-23-2007, 08:11 PM   #1 (permalink)
Insane
 
[C#] Help with threads and file i/o

I hope I'll be able to delineate exactly what my problem is here. In short, I have 2 threads running side-by-side. Each thread has a file open that is being written to. The program is basically looping to try and find a prime factor (the RSA thing) and I write every nth prime to a file so as to have a backup in case of a crash or needing/wanting to shut down the program.

The problem is, the factors don't seem to write to the files unless it's closed properly (I don't understand this). So, I need to either find a way to close the file by pressing Ctrl+C or something, or I need to find a way to force the factors to be written.

I doubt I've explained the problem properly, but feel free to ask questions about it.
wombatman is offline  
Old 05-23-2007, 11:30 PM   #2 (permalink)
Tilted
 
Location: Orlando, FL
I think it may be that I/O is buffered so as to not drag down performance of the system if it had to keep writing often to the disk. First, how often are things written to the file. Second, there may be a way to force the write to occur...I think this may be your issue, and I think I've faced it before. I'll try to get back to you about it, or hopefully someone else has the answer already.

I guess in these coding cases, posting some source code is always useful if possible.
shazbotus is offline  
Old 05-23-2007, 11:31 PM   #3 (permalink)
Insane
 
The writes are happening roughly every 8 seconds and every 80 seconds (depending on which thread is writing).
wombatman is offline  
Old 05-24-2007, 09:09 AM   #4 (permalink)
Lover - Protector - Teacher
 
Jinn's Avatar
 
Location: Seattle, WA
How are you opening the file? And how do you know that both threads won't write to the same file simultaneously, thereby overwriting the other's work? This is a classical shared resource problem, and it's typically solved by busy waiting. Perform each calculation in the thread, but only allow a thread to open the file if it exists and is closed. If it's not closed, sleep until it opens. Once it's open, immediately write the data and close the file.

If you can somehow guarantee exclusive access or know that they won't be overwriting each other, make sure that you're setting the FileShare parameter when you open the file.

i.e.

new FileStream("Filename.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
__________________
"I'm typing on a computer of science, which is being sent by science wires to a little science server where you can access it. I'm not typing on a computer of philosophy or religion or whatever other thing you think can be used to understand the universe because they're a poor substitute in the role of understanding the universe which exists independent from ourselves." - Willravel
Jinn is offline  
Old 05-24-2007, 10:40 AM   #5 (permalink)
Insane
 
I have 2 separate files opened (csharplow.txt and csharphigh.txt). If I delete these two files before I run the program, they're created. I have also added a if(File.Exists()) for each one every time something is supposed to be written to either file, and the system recognizes that the file is there.

I'm using StreamWriter for each file (streamwriters are sw1 and sw2).
wombatman is offline  
Old 05-24-2007, 11:05 AM   #6 (permalink)
Lover - Protector - Teacher
 
Jinn's Avatar
 
Location: Seattle, WA
Oh I think I see what you're saying now.. you want a way to terminate without loss of data?

PHP Code:
sw1 = new StreamWriter("csharplow.txt");
sw2 = new StreamWriter("csharphigh.txt"); 
Invoking the constructor for a StreamWriter counts as an open.

Do your calculations, start your threads, etc..

then

PHP Code:
Console.WriteLine("Press Q to Quit and Save");
  do { 
      
Console.Write(": "); 
      
str Console.ReadLine(); 
 
     } while(
str != "q"); 
  
// Kill threads
  
sw1.Close();
  
sw2.Close(); 
That way you always close them correctly before exit.
__________________
"I'm typing on a computer of science, which is being sent by science wires to a little science server where you can access it. I'm not typing on a computer of philosophy or religion or whatever other thing you think can be used to understand the universe because they're a poor substitute in the role of understanding the universe which exists independent from ourselves." - Willravel
Jinn is offline  
Old 05-24-2007, 12:10 PM   #7 (permalink)
Insane
 
This is all in the main() function?
wombatman is offline  
Old 05-24-2007, 01:02 PM   #8 (permalink)
Crazy
 
Daemon1313's Avatar
 
Location: Atlanta
You have to flush the streamwriter. The OS determines when buffered writes actually make it to disk. When object is destroyed it forces a flush.

The stream writer has a function Flush() that will do it for you. It can be bad on performance but you can explicitly call Flush every time you write something.
__________________
A clear conscience is usually the sign of a bad memory.
Daemon1313 is offline  
Old 05-24-2007, 01:41 PM   #9 (permalink)
Insane
 
Daemon, that did the trick. And it doesn't really hurt the performance, at least not according to my stopwatch. Looks like this should do the trick. Thanks again.
wombatman is offline  
Old 05-29-2007, 06:33 AM   #10 (permalink)
Tilted
 
Location: Ontario, Canada
I think from my experience the best way to deal with objects like this is to use the "using" operator when opening/closing he objects. By using "using", it automatically calls any dispose/flush/close functions that an object might have.

The syntax is like the following:

using( StreamWriter strWriter = new StreamWriter ("txtFileName.txt") )
{
// do whatever you want to do with it...
//
}

When the "using" directive is out of scope/finished, it then automatically calls any cleanup functionality. I just find it is safer to use this way, and it might even be more efficient on the system (you'll have to look that up to verify).
__________________
" Can't keep my eyes from the circling skies, Tongue-tied and twisted just an earth-bound misfit, I "

Last edited by Nooze2k; 05-29-2007 at 06:36 AM.. Reason: Automerged Doublepost
Nooze2k is offline  
Old 05-29-2007, 10:31 AM   #11 (permalink)
Crazy
 
Daemon1313's Avatar
 
Location: Atlanta
wombatman, glad to help. The performance issues with dynamically calling flush will not always be noticeable. If the OS is idle it will not have any impact but if its busy and you interupt it to force a flush it can be noticeable.

Nooze2k, that is the best way of handling the situation if you can limit the scope fo the streamwriter but it sounds like he wants to keep it open. Constantly opening and disposing the the streamwriter would be hell on performance.
__________________
A clear conscience is usually the sign of a bad memory.
Daemon1313 is offline  
 

Tags
file, i or o, threads


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -8. The time now is 12:06 AM.

Tilted Forum Project

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Optimization by vBSEO 3.6.0 PL2
© 2002-2012 Tilted Forum Project

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360