Достаточно добавить «бесконечность» к вашей анимации, чтобы она запускалась более одного раза: animation: rings 1s infinite;
:
"use strict";
const element = document.getElementById("trigger");
element.addEventListener("mouseover", function(e){
element.classList.remove("animated");
void element.offsetWidth;
element.classList.add("animated");
}, false);
body { background: #333;}
#trigger {
margin: 60px auto;
padding: 30px;
position: relative;
border: 2px solid red;
width: 300px;
text-align: center;
}
#trigger * {
pointer-events: none;
}
#trigger img {
width: 140px;
border-radius: 100%;
padding: 2px;
}
#trigger.animated span {
border-radius: 100% / 100%;
position: absolute;
width: 140px;
height: 140px;
border: 2px solid #fff;
background: #333;
z-index: -1;
animation: rings 1s;
}
#trigger span:nth-child(1) {
animation-delay: 0s;
}
#trigger span:nth-child(2) {
animation-delay: 0.2s;
}
#trigger span:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes rings {
0% {
opacity: 0;
transform: scale(1);
}
70% {
opacity: 1;
transform: scale(1.3);
}
100% {
opacity: 0;
transform: scale(1);
}
}
<div id="trigger" class="animated">
<span></span>
<span></span>
<span></span>
<img src="https://picsum.photos/140/140" alt="some pic">
</div>
[ 118] Заметьте, что, если родительский процесс завершается, это очень возможно и даже вероятно, что PID будет снова использован для другого процесса. Это - стандартная операция окон.
Так, чтобы быть уверенным, как только Вы получаете идентификатор родителя и уверены, что это - действительно Ваш родитель, необходимо открыть дескриптор для него и использование это.
На всякий случай кто-либо еще натыкается на этот вопрос и ищет пример кода, я должен был недавно сделать это для проекта библиотеки Python, я продолжаю работать. Вот тест/пример кода, который я придумал:
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
int main(int argc, char *argv[])
{
int pid = -1;
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe = { 0 };
pe.dwSize = sizeof(PROCESSENTRY32);
//assume first arg is the PID to get the PPID for, or use own PID
if (argc > 1) {
pid = atoi(argv[1]);
} else {
pid = GetCurrentProcessId();
}
if( Process32First(h, &pe)) {
do {
if (pe.th32ProcessID == pid) {
printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);
}
} while( Process32Next(h, &pe));
}
CloseHandle(h);
}
, "С другой стороны, кто-то может облегчить мой страх, что изодромное с предварением, я являюсь передающим, могло бы принадлежать другому процессу через какое-то время, если родитель умер?"
Да, PID может быть снова использован. В отличие от UNIX, Windows не поддерживает сильное дерево отношений отцов и детей.
Лучший способ сделать это - вызвать DuplicateHandle ()
для создания наследуемой копии дескриптора вашего процесса. Затем создайте дочерний процесс и передайте значение дескриптора в командной строке. Закройте
дублированный дескриптор в родительском процессе. Когда ребенок закончит, ему нужно будет закрыть
свою копию.
ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K
{
ULONG_PTR pbi[6];
ULONG ulSize = 0;
LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength);
*(FARPROC *)&NtQueryInformationProcess =
GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
if(NtQueryInformationProcess){
if(NtQueryInformationProcess(GetCurrentProcess(), 0,
&pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
return pbi[5];
}
return (ULONG_PTR)-1;
}