Chwilowe zatrzymanie kopiowania plików


Zdarza sie (zwlaszcza w czasach mody na wirtualizacje), ze trzeba skopiowac duze pliki. Albo nawet nieduze, ale przy pomocy niezbyt szybkiej sieci. Zaczynamy kopiowac, po dlugim oczekiwaniu mamy juz kilkadziesiat procent i cos sie wydarza. Albo potrzebujemy pelnej przepustowosci lacza na chwile, albo dysk sie przegrzewa, albo miejsce sie konczy... Idealem bylby dodatkowy przycisk "Pause" w okienku z postepem kopiowania. Ale, jako ze takiego przycisku nie ma, trzeba sobie radzic inaczej. Kopiowanie jest jednym z watków procesu explorer.exe Kazdy watek mozna na dowolnie dlugi czas wstrzymac. Przeciez wlasnie to robi co kilka milisekund systemowy scheduler. Dzieki temu uzytkownik ma wrazenie, ze na jego komputerze dziala kilka aplikacji na raz. Wystarczy wiec oznaczyc watek tak, zeby nie trafial do kolejki watków do wykonania. Sa do tego specjalne funkcje, ale to jest blog ITPro, a jezeli jakis programista zechce, to sobie znajdzie cos wiecej.
Tak wiec, wiemy, ze chcemy wstrzymac watek odpowiedzialny za kopiowanie plików. Po pierwsze, musimy go zidentyfikowac, po drugie – technicznie móc go wstrzymac. O ile identyfikacja narzedziami wbudowanymi w system jest wykonalna, o tyle wstrzymywanie to juz bylaby sztuka dla sztuki. Znacznie prosciej bedzie (tym razem moge sie na GUI zgodzic) uzyc narzedzia Process Explorer.
Po uruchomieniu procexp.exe (najlepiej w kontekscie administratora):
Znajdz proces Explorer.exe. Jezeli sa dwa takie procesy w ramach jednej sesji, to prawdopodobnie wlasciwy bedzie ten z wiekszym PID.
Otwórz jego wlasciwosci i przejsc do zakladki Threads (czwarta zakladka).
Jezeli na zakladce widzisz nazwy bibliotek i nazwy funkcji to dobrze. Jezeli nazwy bibliotek i tajemnicze liczby, to znaczy ze nie skonfigurowales symboli. Warto, choc dla potrzeb niniejszego cwiczenia nie jest to niezbedne.
Jezeli pliki sie kopiuja, to w watkach explorera powinny sie pokazac watki zwiazane shlwapi.dll (Shell Lightweight). Zazwyczaj watki te zuzywaja zauwazalna ilosc CPU. Najczesciej, jeden z tych watków sluzy do wyswietlania okienka, drugi – wykonuje wlasciwa prace zwiazana z kopiowaniem danych. Najprostsza metoda rozróznienia ich jest zaznaczenie watku i sprawdzenie pola "state" w dolnej czesci okna. Ten watek, który czeka na UserRequest to kawalek GUI. Ten drugi czeka zazwyczaj na odczyt albo zapis danych, w zaleznosci od sytuacji. I o ten wlasnie watek nam chodzi. Znalezienie wlasciwego watku to 3/4 sukcesu.
Jezeli wlasciwy watek jest zaznaczony, to wystarczy kliknac "Suspend" w prawym dolnym rogu okna. Watek zostaje zawieszony i nie bedzie wykonywany do czasu odwieszenia go. Znaczy to ze pliki sie nie kopiuja. A o to wlasnie chodzilo.
Watek taki moze pozostawac zawieszony dowolnie dlugo, ale lepiej kiedys pozwolic mu sie w normalny sposób wykonac i zakonczyc, ewentualnie pomagajac sobie przyciskiem "Cancel". Zawieszone kopiowanie pozwala na wykonanie innych wazniejszych rzeczy, po których mozna je spokojnie wznowic.
Jezeli zawieszenie watku skonczy sie tym, ze okno kopiowania przestanie odpowiadac, oznacza to, ze wybrales niewlasciwy watek shlwapi. Jezeli po zawieszeniu jakiegos watku, Process Explorer przestanie odpowiadac – zamknij go, uruchom jeszcze raz, znajdz ten watek i wznów go.
Milej zabawy. Oczywiscie Process Explorer nie tylko to potrafi, ale do tego celu równiez sie swietnie nadaje.

Autor: Grzegorz Tworek

Comments (3)

  1. Ha! ja Ci powiem, że właśnie twój problem mnie zainspirował 🙂

    Stąd wzmianka o przegrzewaniu. A samą sztuczkę podpatrzyłem u Davida Solomona na jednym z jego seminariów.

  2. Ty mnie Grzesiek nie przestajesz zadziwiać w grzebaniu po narzędziach 🙂

    Szkoda, że chwilę wcześniej nie wiedziałem o tym to bym przetestował w sytuacji jak mi się dysk przegrzewał (http://ewangelista.it/archive/2009/01/24/przej-cia-z-dyskiem-seagate.aspx).

    Wtedy skorzystałem z naszego wewnętrznego programiku do kopiowania z pauzowaniem.

  3. Manyek says:

    Hmm… Całkiem przydatna rzecz 🙂  Tylko… Tych wątków (shlwapi.dll) było u mnie 6. Ale po rozpoczęciu kopiowania można łatwo dojść, który jest za to odpowiedzialny, bowiem wtedy widać także uaktywnienie obciążenia procesora przy tymże wątku 🙂  No a taki przycisk PAUSE na pewno by się przydał…

    Pozdrawiam serdecznie 😀

Skip to main content