Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Regarding Locking The File
Forum Updated to NodeBB v4.3 + New Features

Regarding Locking The File

Scheduled Pinned Locked Moved General and Desktop
39 Posts 10 Posters 18.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    I Offline
    Indrajeet
    wrote on last edited by
    #21

    Hi Zap

    Can you please show how to lock the file while writing.

    Regards
    Indrajeet

    1 Reply Last reply
    0
    • I Offline
      I Offline
      Indrajeet
      wrote on last edited by
      #22

      Hi Volker

      Both are there but you can answer for second option.i.e
      This DLL is used by more than 1 application on same PC. Read & Write will be performed on same file kept at some shared location.

      Regards
      Indrajeet

      1 Reply Last reply
      0
      • Z Offline
        Z Offline
        ZapB
        wrote on last edited by
        #23

        No. You have not answered the question. We cannot advise you in detail until you give us a definitive description of the problem first.

        We have already told you two alternative approaches depending on your situation.

        Nokia Certified Qt Specialist
        Interested in hearing about Qt related work

        1 Reply Last reply
        0
        • Z Offline
          Z Offline
          ZapB
          wrote on last edited by
          #24

          Sorry our last replies must have crossed in mid-air. If both apps are on the same machine then use QSystemSemaphore. What is not clear about that?

          Nokia Certified Qt Specialist
          Interested in hearing about Qt related work

          1 Reply Last reply
          0
          • I Offline
            I Offline
            Indrajeet
            wrote on last edited by
            #25

            Hi Zap

            Can you please show me how to use QSystemSemaphore
            to avoid multiple processes to write in single file at same time.

            1 Reply Last reply
            0
            • A Offline
              A Offline
              andre
              wrote on last edited by
              #26

              A QSystemSemaphore can protect a resource. A resource can almost anything: a block of memory, access to a piece of hardware, or access to a file. In your case, you allow only one access to your file at the same time. So, you create a semaphore with an appropriate key (perhaps "com.your.domain.your.app/yourFile" or something unique like that), and use an initial value of 1. Then, when you want to start accessing your file, you call the acquire() method on the semaphore, and check the return value. If the return value is true, then you have successfully acquired the resource (access to the file), and can proceed to modify the file. If you get a false, then something else is already accessing the file and you can not modify it.

              1 Reply Last reply
              0
              • K Offline
                K Offline
                KA51O
                wrote on last edited by
                #27

                I had a similar problem. My application is watching a directory using QFileSystemWatcher. If a new file is stored in the directory i want to read that file. The file is written to the directory by another application which is in no way connected to my app. The problem I encountered was that sometimes the FileSystemWatcher notices a new file and I start reading it with QFile.readAll() before it is acctually completely written, thus getting an empty or incomplete String. My dirty solution was checking if the file was modified within the last 2 seconds and if not start reading. This works in my case since the file is only once written and afterwards will only be accessed or modified by my application. But in the case mentioned by the OP this wont work.

                @Andre: Will QSystemSemaphore be an adequate solution for my problem as well ?

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  andre
                  wrote on last edited by
                  #28

                  [quote author="KA51O" date="1309335683"]@Andre: Will QSystemSemaphore be an adequate solution for my problem as well ?[/quote]
                  No, it will not.
                  The use of QSystemSemaphore assumes that the process all use that same semaphore to get access to the resource. If they don't (and your case, you can be sure of that), then the semaphore is useless.

                  1 Reply Last reply
                  0
                  • K Offline
                    K Offline
                    KA51O
                    wrote on last edited by
                    #29

                    Too bad. Thanks for the reply anyways.
                    Is there maybe another way to deal with my problem in a more "professional" way? I cannot use any OS specific methods like 'fuser' or 'lsof'.

                    1 Reply Last reply
                    0
                    • I Offline
                      I Offline
                      Indrajeet
                      wrote on last edited by
                      #30

                      Hi Andre

                      If I acquire the semaphore while writing the file,
                      Can any other process can read the same file at that time or only after semaphore is released.

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        KA51O
                        wrote on last edited by
                        #31

                        No you cannot read while someone else has aquired the semaphore and is writing.

                        How about using "QReadWriteLock":http://developer.qt.nokia.com/doc/qt-4.7/qreadwritelock.html ?
                        I think its more intuitive to use.

                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          andre
                          wrote on last edited by
                          #32

                          @Rajveer:
                          QReadWriteLock does not work across processes, so it is useless for this case.

                          It is up to you to figure out if you want to allow reading while the file is being written to too. It depends on your application if that is a problem or not. You can look at QReadWriteLock to see what kind of problems you may expect though, and what kind of algorithm you could use.

                          By default, if you only use one semaphore for all file access, then both reading and writing block the file completely. You could implement something more intelligent than that based on using one or more semaphores though. QReadWriteLock can be an inspiration for that.

                          1 Reply Last reply
                          0
                          • I Offline
                            I Offline
                            Indrajeet
                            wrote on last edited by
                            #33

                            Hi KA51O

                            So if i take a WriteLock while writing to the file,so can any other process can read at that time.

                            1 Reply Last reply
                            0
                            • A Offline
                              A Offline
                              andre
                              wrote on last edited by
                              #34

                              [quote author="KA51O" date="1309336526"]Too bad. Thanks for the reply anyways.
                              Is there maybe another way to deal with my problem in a more "professional" way? I cannot use any OS specific methods like 'fuser' or 'lsof'.[/quote]

                              Why cannot you use those? You could implement a solution based on OS specific methods for each OS you support.

                              1 Reply Last reply
                              0
                              • I Offline
                                I Offline
                                Indrajeet
                                wrote on last edited by
                                #35

                                Hi Andre

                                Below is example code for Read & write

                                Read:
                                @
                                QFile myfile(filename);
                                if (myfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Open the file
                                {
                                Reading code;
                                myfile.close();
                                }
                                @

                                Write:
                                @
                                QFile myfile(filename);
                                if (myfile.open(QIODevice::WriteOnly)) // Open the file
                                {
                                writing code;
                                myfile.close();
                                }
                                @

                                Andre can you please show me how to use the semaphore with above two codes.

                                1 Reply Last reply
                                0
                                • A Offline
                                  A Offline
                                  andre
                                  wrote on last edited by
                                  #36

                                  No, I gave you enough pointers to get going on your own. Why don't you give using the semaphore a try on your own, and come back with what you came up with?

                                  1 Reply Last reply
                                  0
                                  • I Offline
                                    I Offline
                                    Indrajeet
                                    wrote on last edited by
                                    #37

                                    Ok Andre I will do that.

                                    1 Reply Last reply
                                    0
                                    • G Offline
                                      G Offline
                                      goetz
                                      wrote on last edited by
                                      #38

                                      [quote author="Rajveer" date="1309338534"]Hi KA51O

                                      So if i take a WriteLock while writing to the file,so can any other process can read at that time.

                                      [/quote]

                                      Any other process that takes part in the (system) semaphore game will most probably not read the file. Any process which does not use a semaphore or mutex can happily read and write the file as long as it has the OS permission to do so.

                                      You can not avoid that situation entirely, you have to rely on the good behavior of all parties joining the party.

                                      http://www.catb.org/~esr/faqs/smart-questions.html

                                      1 Reply Last reply
                                      0
                                      • K Offline
                                        K Offline
                                        KA51O
                                        wrote on last edited by
                                        #39

                                        [quote author="Andre" date="1309338341"]@Rajveer:
                                        QReadWriteLock does not work across processes, so it is useless for this case. [/quote]
                                        Thanks for the hint.

                                        I hadn't stumbled upon "QSystemSemaphore's":http://developer.qt.nokia.com/doc/qt-4.7/qsystemsemaphore.html up until now. Thanks for that hint too.

                                        1 Reply Last reply
                                        0

                                        • Login

                                        • Login or register to search.
                                        • First post
                                          Last post
                                        0
                                        • Categories
                                        • Recent
                                        • Tags
                                        • Popular
                                        • Users
                                        • Groups
                                        • Search
                                        • Get Qt Extensions
                                        • Unsolved